我如何将参数传递给后台工作者?

问题描述 投票:1回答:2

我目前有一个用数据填充列表视图的函数。该函数获取传递的参数。

我现在想在与主ui线程不同的线程中填充listview。但是我有点不确定如何将参数传递给线程。

vb.net parameters backgroundworker
2个回答
3
投票

它必须通过RunWorkAsync作为参数(对象)传递。确保将其投射到传递的任何内容上。

Private Sub frm_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    bgwThread.RunWorkerAsync('your parameters here')

    'e.g.:
    Dim sTemp As String = "Hello"
    bgwThread.RunWorkerAsync(sTemp) 
End Sub

Private Sub bgWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles bgwThread.DoWork
    Dim sThisIsYourParameter As String = CStr(e.Argument)

    '...
    DoStuff()
End Sub

尽管正如Hans所说,您不能在另一个线程中填充ListView。这只是“如何将参数传递给后台工作人员。”


0
投票

[旧帖子,但这是对绊脚石的任何人的完整解决方案。这允许将参数传递给Backgroundworker,支持取消操作,并将信息传递回主线程(通过ProgressChanged),在此可以更新ListView。我从头开始创建了一个解决方案。经过测试的工作。

C#/ .NET Framework 4.6.2 / VS2019内部版本16.4.1

BackgroundWorker1属性:

WorkerReportsProgress = True

WorkerSupportsCancellation = True

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace test2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(Object sender, EventArgs e)
        {
            listView1.View = View.Details;
            listView1.GridLines = true;

            listView1.Columns.Add("Store",100);
            listView1.Columns.Add("Product", 100);
            listView1.Columns.Add("Price", 60);
            listView1.Columns.Add("Qty", 60);
        }

        private void backgroundWorker1_DoWork(Object sender, DoWorkEventArgs e)
        {
            if(!(e.Argument is String store)) return;

            List<String> items = new List<String>();

            if(backgroundWorker1.CancellationPending) {e.Cancel = true; return;}

            items.Add(store);
            items.Add("Bananas");
            items.Add("0.79");
            items.Add("50");

            backgroundWorker1.ReportProgress(0, items);
        }

        private void backgroundWorker1_ProgressChanged(Object sender, ProgressChangedEventArgs e)
        {
            if(!(e.UserState is List<String> resultitems)) return;

            ListViewItem itm = new ListViewItem(resultitems.ToArray());
            listView1.Items.Add(itm);
        }

        private void backgroundWorker1_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
        {
            //Do any final cleanup once backgroundworker is complete
        }

        private void button1_Click(Object sender, EventArgs e)
        {
            if(backgroundWorker1.IsBusy)
            {
                backgroundWorker1.CancelAsync();
                return;
            }

            backgroundWorker1.RunWorkerAsync("Glendale");
        }

        private void button2_Click(Object sender, EventArgs e)
        {
            if(backgroundWorker1.IsBusy)
            {
                backgroundWorker1.CancelAsync();
                return;
            }

            backgroundWorker1.RunWorkerAsync("Toledo");
        }
    }
}

Program Output

© www.soinside.com 2019 - 2024. All rights reserved.