C# 从其他线程更新GUI

C# 从其他线程更新GUI,c#,.net,multithreading,C#,.net,Multithreading,我正在尝试从另一个线程更新列表框,最简单的方法是什么 我试着调用文本框,但没有成功 private void dowork() { TcpClient client = new TcpClient(); client.Connect("192.168.1.3", 10); StreamWriter writer = new StreamWriter(client.GetStream()); StreamReader reader = new StreamReade

我正在尝试从另一个线程更新列表框,最简单的方法是什么

我试着调用文本框,但没有成功

private void dowork()
{
    TcpClient client = new TcpClient();
    client.Connect("192.168.1.3", 10);
    StreamWriter writer = new StreamWriter(client.GetStream());
    StreamReader reader = new StreamReader(client.GetStream());

    JObject o = new JObject();
    o.Add("comando", 1);
    o.Add("dir", @"C:\Users\klein\Desktop\Acionamentos");
    writer.Write(o.ToString());
    writer.Flush();
    JArray array = JArray.Parse(reader.ReadToEnd());
    for (int i = 0; i < array.Count; i++)
    {
        listBox1.Items.Add(array[i]);  //update GUI from this thread
    }
}

private void button1_Click(object sender, EventArgs e)
{
    Thread t = new Thread(dowork);
    t.Start();
}
private void dowork()
{
TcpClient client=新的TcpClient();
client.Connect(“192.168.1.3”,10);
StreamWriter writer=新的StreamWriter(client.GetStream());
StreamReader=新的StreamReader(client.GetStream());
JObject o=新的JObject();
o、 添加(“comando”,1);
o、 添加(“dir”,@“C:\Users\klein\Desktop\Acionamentos”);
writer.Write(o.ToString());
writer.Flush();
JArray数组=JArray.Parse(reader.ReadToEnd());
for(int i=0;i
您可以使用
控件。调用
进入UI线程,然后更新列表框


但是,我建议您考虑使用
BackgroundWorker

我将使用
BackgroundWorker
,您可以在
dowwork
中执行异步操作,使用
bgworker.ReportProgress()
报告进度,您将在
progresschange
中获得回调(我将为处理的每个元素调用ReportProgress),然后您将能够更新GUI控件

工作人员还可以在结束时激发
RunWorkerCompleted

YourType arrayitem;

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    TcpClient client = new TcpClient();
    client.Connect("192.168.1.3", 10);
    StreamWriter writer = new StreamWriter(client.GetStream());
    StreamReader reader = new StreamReader(client.GetStream());

    JObject o = new JObject();
    o.Add("comando", 1);
    o.Add("dir", @"C:\Users\klein\Desktop\Acionamentos");
    writer.Write(o.ToString());
    writer.Flush();
    JArray array = JArray.Parse(reader.ReadToEnd());

    int percentage;

    for (int i = 0; i < array.Count; i++)
    {
        arrayitem = array[i];
        percentage = ((i + 1)*100)/array.Count;
        backgroundWorker1.ReportProgress(percentage);
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    listBox1.Items.Add(arrayitem);
    progressBar1.Value = e.ProgressPercentage; // in case you'd want to add a progressbar
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    label1.Text = "Done";
}
YourType数组项;
私有void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
TcpClient client=新的TcpClient();
client.Connect(“192.168.1.3”,10);
StreamWriter writer=新的StreamWriter(client.GetStream());
StreamReader=新的StreamReader(client.GetStream());
JObject o=新的JObject();
o、 添加(“comando”,1);
o、 添加(“dir”,@“C:\Users\klein\Desktop\Acionamentos”);
writer.Write(o.ToString());
writer.Flush();
JArray数组=JArray.Parse(reader.ReadToEnd());
整数百分比;
for(int i=0;i

请记住,您的backgroundworker必须在
WorkerReportProgress
属性中具有true。

您需要使用Dispatcher.BeginInvoke。您可以查看链接以更好地了解如何从不同线程更新UI控件。 例如,如果listbox名为listbox1

for (int i = 0; i < array.Count; i++)
{
    listBox1.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
        new Action(delegate() { listBox1.Items.Add(array[i]) });
}
for(int i=0;i
(可能重复)可能重复您有关于这种方法的示例吗?我添加了一个示例,希望对您有所帮助。