0

我正在尝试向我的 UI 显示循环的内容。首先,我不确定我是否以正确的方式(使用 WinForms)来解决这个问题,但这就是我正在做的事情:

foreach (string item in stringArray)
{
        Thread thread = new Thread(delegate()
                              {
                                  UpdatedResultEvent(item);
                              });
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
}

我希望这是足够的信息,但如果不是,那么我将在这里更详细地介绍。

我有 2 个类,我的 Program.cs (WinForm) 和另一个名为 logicClass 的类。我将我的 Program 对象的一个​​实例传递给我的 logicClass。我的 logicClass 有一个委托,其签名与我的 Program 类中的方法匹配。作为委托传递的方法是

public void UpdateResultsOnScreen(string newContent)
{
txtResults.Text += newContent;
}

错误信息是

跨线程操作无效:控件从创建它的线程以外的线程访问

编辑

目标是,类似于进度条的工作方式,是看到控件实时更新。目前,即使它确实有效,线程也不会在线程完成之前将“结果”返回到屏幕。

4

3 回答 3

1

使用这个(如果你在 WinForms 上):

public void UpdateResultsOnScreen(string newContent)
{
    txtResults.BeginInvoke(
        new Action<string>((value) =>
        {
            txtResults.Text += value;
        }),
        newContent);
}

也正如animaonline所说,考虑使用ThreadPoolor Parallel.ForEach

于 2013-03-04T10:01:39.900 回答
1

即使您正在设置 ApartmentState,当从另一个(非 UI)线程访问时,也必须调用 UI 控件。

确保在 UpdateResultEvent 方法中调用 UI 控件。

无论如何,您所做的不是一个好主意,请考虑使用ThreadPoolParallel.ForEach

它会自动扩展你的代码,产生一堆线程确实会降低性能,特别是如果你的集合中有很多项目。

于 2013-03-04T09:50:27.293 回答
0

这个怎么做??

 public void UpdateResultsOnScreen(string newContent)
    {
        if(txtResults.InvokeRequired)
        {
            txtResults.Invoke(
                new Action<string>(content => txtResults.Text += content), newContent);
            return;
        }
        txtResults.Text += newContent;
    }
于 2013-03-04T10:05:21.457 回答