看到我的下面的代碼,並告訴我什麼是錯誤的,當我的用戶界面更新時,所有任務完成,但根據代碼更新標籤值時,我的例程正在調用任務。在我的代碼中改變什麼。當所有任務完成時,我的用戶界面得到更新
例如說當DoSomething1被調用時,則需要在用戶之前更新和反映label3。
private void button1_Click(object sender, EventArgs e)
{
TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
var token = Task.Factory.CancellationToken;
var tasks = new[]
{
Task.Factory.StartNew(DoSomething1,token,TaskCreationOptions.None, uiScheduler),
Task.Factory.StartNew(DoSomething2,token,TaskCreationOptions.None, uiScheduler),
Task.Factory.StartNew(DoSomething3,token,TaskCreationOptions.None, uiScheduler)
};
Task.WaitAll(tasks);
//var things = Task.WhenAll(tasks);
int x=0;
}
public void DoSomething1()
{
//this.label3.BeginInvoke(new Action(() =>
//{
// this.label3.Text = "DoSomething1 -- " + System.Threading.Thread.CurrentThread.ManagedThreadId;
//}));
this.label3.Text = "DoSomething1 -- " + System.Threading.Thread.CurrentThread.ManagedThreadId;
System.Threading.Thread.Sleep(1000);
}
public void DoSomething2()
{
//this.label4.BeginInvoke(new Action(() =>
//{
// this.label4.Text = "DoSomething2 -- " + System.Threading.Thread.CurrentThread.ManagedThreadId;
//}));
this.label4.Text = "DoSomething2 -- " + System.Threading.Thread.CurrentThread.ManagedThreadId;
System.Threading.Thread.Sleep(1000);
}
public void DoSomething3()
{
//this.label5.BeginInvoke(new Action(() =>
//{
// this.label5.Text = "DoSomething3 -- " + System.Threading.Thread.CurrentThread.ManagedThreadId;
//}));
this.label5.Text = "DoSomething3 -- " + System.Threading.Thread.CurrentThread.ManagedThreadId;
System.Threading.Thread.Sleep(1000);
}
你沒有使用或通過'uiScheduler和令牌'那麼爲什麼你創造這個? – Mou
首先,使用'uiScheduler'是你的代碼主要的錯誤。這是不可能的使用它,仍然有代碼工作。你的代碼並沒有顯示你實際上使用了'token'(你把它傳遞給'StartNew()',但你自己的代碼從未使用它,所以你的任務不能被取消),所以我沒有辦法知道它是如何應該在任何替代的例子中使用,所以我只是把它排除在外。正如你可以從我的代碼示例中的註釋中看到的,如果你想要取消任務,你必須將它傳遞給你想要取消的任務。 –
如果我評論這一行然後會發生什麼'TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();' – Mou