C# 动态线程和标签创建

C# 动态线程和标签创建,c#,multithreading,C#,Multithreading,我有一个按钮中新线程的代码 每当我点击那个按钮,新的线程就会被创建。我想要一些方法,这样我就可以在窗体上有一些包含所有创建线程进度的内容 类似于包含显示完成百分比的标签的列表框 var t = new Thread(() => { for(int i=0;i<1000;i++) { x++; } }); t.SetApartmen

我有一个按钮中新线程的代码 每当我点击那个按钮,新的线程就会被创建。我想要一些方法,这样我就可以在窗体上有一些包含所有创建线程进度的内容 类似于包含显示完成百分比的标签的列表框

var t = new Thread(() =>
        {
            for(int i=0;i<1000;i++)
            {
                 x++;
             }
        });
        t.SetApartmentState(ApartmentState.STA);
        t.Name = projectName;
        t.Start();
var t=新线程(()=>
{

对于(int i=0;i),如果您对所启动的线程数进行计数,然后用索引启动每个线程,则线程可以更新该索引的进度值。

首先考虑使用基于任务的方法(仅当您使用.NET 3.5或以上)时。

无论如何,当您创建一个新线程时,您可以在
列表框中添加一个新标签,并随着工作的进展更新其内容。
例如:

void ButtonClick(object sender, RoutedEvent e)
{
   Label label = new Label();
   listBox1.Items.Add(label);       

   Task.Factory.StartNew(() =>
   {
       for (int i = 0; i < 100; i++)
       {
          label.Content = (i + 1).ToString() + "%";
       }
   });
}
void按钮单击(对象发送方,路由事件e)
{
标签=新标签();
列表框1.Items.Add(标签);
Task.Factory.StartNew(()=>
{
对于(int i=0;i<100;i++)
{
label.Content=(i+1).ToString()+“%”;
}
});
}

显然修复了跨线程调用(在WPF中使用Dispatcher.Invoke/Dispatcher.BeginInvoke,或在WinForms中使用label.Invoke).

您使用的是什么体系结构?WPF?WinForms?这是行不通的,因为只有UI线程可以更新UI控件。这就是为什么我建议将索引传递到数组中,因为后台线程可以安全地更新数组元素,UI可以在固定的时间间隔内安全地读取和显示它。是的,但如果在WPF中使用Dispatcher.Invoke您可以安全地更新UI。对,WinForms也有一种类似的技术(如果有点困难的话)。尽管如此,您展示的代码(最初缺少警告)是坏的。我建议,即使你有一个安全的方法来更新UI,你可能仍然希望避免这样做;我建议的技术工作得很好。你是否注意到了另一个问题?这就是我在线程体中所做的,如果我下次更新同名标签时声明一个标签,当按下按钮时它将重复Ed,因为它实际上不处理跨线程问题。但我必须显示与线程一样多的标签,这是我真正不愿意看到的。我要说的是,你要保留任务计数,每个任务有一个计数器的数组。要启动任务,你要添加一个控件或启用它,然后用当前计数和inc启动任务记住它。然后任务将其用作数组的索引,并根据需要增加元素。然后UI轮询该数组并使用它更新相应的控件。我相信此摘要足以让您实现解决方案。