有人可以幫助我如何設置我的班級內的Thread.join()方法,或者如果有一個整潔的方式如何處理SynchronizationContext
類和thread.join
方法。基本上,即時通訊嘗試從不同的線程(而不是UI線程)每2秒更新一次datagridview(dgv)單元格和進度條(pb)。當一個線程完成這項工作時,該功能可以正常工作然而,我想設置2個線程,以便第一個線程(線程1)將更新控件(在我的情況下,它將更新datagridview並顯示10行,並且進度條將更新爲50%)。只要線程1完成了它的工作,線程2應該啓動並更新控件(在我的情況下,它將更新datagridview並顯示10多行並且進度條將更新爲100%)。請參閱下面的代碼。跨線程交互c#
using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
namespace DelegatesAndCallback
{
public partial class Form1 : Form
{
private Thread newThread1;
private Thread newThread2;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int id = Thread.CurrentThread.ManagedThreadId;
Trace.WriteLine("Button thread "+id);
SynchronizationContext uiContext = SynchronizationContext.Current;
// thread #1
startThread1(uiContext);
// thread #2
startThread2(uiContext);
}
public void startThread1(SynchronizationContext sc)
{
// thread #1
newThread1 = new Thread(Process1) { Name = "Thread 1" };
newThread1.Start(sc);
//newThread1.Join();
}
public void startThread2(SynchronizationContext sc)
{
// thread #2
newThread2 = new Thread(Process2) { Name = "Thread 2" };
newThread2.Start(sc);
//newThread2.Join();
}
public void updateProgressBarValue(object state)
{
double val = Convert.ToDouble(state)/19.0;
pb.Value = (int)(100*val);
}
public void updateDataGridViewValue(object state)
{
dgv.Rows.Add((int) state, (int) state);
}
public void Process1(object state)
{
SynchronizationContext uiContext = state as SynchronizationContext;
for (int i = 0; i < 10; i++)
{
uiContext.Send(updateDataGridViewValue, i);
uiContext.Send(updateProgressBarValue, i);
Thread.Sleep(2000);
}
}
public void Process2(object state)
{
SynchronizationContext uiContext = state as SynchronizationContext;
for (int i = 10; i < 20; i++)
{
if (uiContext != null) uiContext.Send(updateProgressBarValue, i);
if (uiContext != null) uiContext.Send(updateDataGridViewValue, i);
Thread.Sleep(2000);
}
}
}
}
究竟是你尋求幫助什麼叫UI更新?使用thread.join有什麼問題?爲什麼你需要兩個線程?你能從第一個開始第二個線程嗎? – Chris 2012-01-18 17:21:25
@ Chris,你是對的Chris,如果我在第一個線程中添加第二個線程,它將起作用。然而,即時通訊嘗試使用thread.join方法,一旦第一個線程完成其作業,第二個線程就開始工作。 – 2012-01-18 17:29:54
麻煩的是,thread.join我相信在等待其他線程完成時暫停當前線程的執行。因此,在你的例子中,如果你取消註釋了'.Join()',那麼你在同一個線程中做的沒有多大區別(有一些差異,但不是簡單的程序流程)。 – Chris 2012-01-19 18:48:50