如何在C#中将数组作为参数传递给doWork函数

4

我需要在readstream函数内使用类似comboBox1.text和comboBox2.Text的表单控件,但是会出现错误信息(从德语翻译而来):

访问控件元素comboBox1/comboBox2不是从创建它的线程,而是从另一个线程!!!

我需要传递这些控件到readstream函数中,但我不知道具体该怎么做。

代码

private void button1_Click(object sender, EventArgs e)
{
    BackgroundWorker worker = new BackgroundWorker;
    worker.WorkerReportsProgress = true;
    worker.ProgressChanged += ProgressChanged;
    worker.DoWork += ReadStream;

    //Need to pass the comoBox Texts from here!!!
    string start = comboBox1.Text;
    string end = comboBox2.Text;
    worker.RunWorkerAsync();
}

private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    UpdateProgressBar(e.ProgressPercentage);
    comboBox1.Text = e.UserState.ToString();
}

private void ReadStream(object sender, DoWorkEventArgs doWorkEventArgs)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    string line;
    //And use the values here !!!!
    using (StreamReader sr = new StreamReader("file", System.Text.Encoding.ASCII))
    {
        while (!sr.EndOfStream)
        {
            line = sr.ReadLine();
            worker.ReportProgress(line.Length);
        }
    }
}
2个回答

9
在调用 worker.RunWorkerAsync(); 之前,请执行以下操作:
string[] texts = new string[] {start, end};
worker.RunWorkerAsync(texts);

然后,在ReadStream(...)中。
string[] extracted = (string[])doWorkEventArgs.Argument;
string start = extracted[0];
string end = extracted[1];

3

尝试使用以下代码将数组作为参数传递:

worker.RunWorkerAsync(array);

使用此代码获取此数组:

doWorkEventArgs.Argument

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接