編輯:Application.DoEvents();這是做到了。在這裏找到:Force GUI update from UI Thread如何使表單延遲顯示
c#,winforms。我想增加一個1的步數,並將這些增量顯示在列表視圖中,以便用戶看到數字向上計數(例如從10到15)。
我有另一個按鈕,點擊時只增加1,並使用相同的顯示()。它工作正常並按預期更新顯示。
我試圖這些代碼(縮短到這裏節省空間):
(1)
for (int i = 0; i < 5; i++)
{
var t = Task.Run (async() =>
{
myInt++;
await Task.Delay(300);
display(); //forces screen refresh
});
}
(2)
for (int i = 0; i < 5; i++)
{
var t = Task.Run (() =>
{
myInt++;
Task.Delay(300).Wait;
display();
});
//t.Wait(); //causes "An unhandled exception of type 'System.AggregateException' occurred in mscorlib.dll"
}
(3)
for (int i = 0; i < 5; i++)
{
myInt++;
display();
System.Threading.Thread.Sleep(300);
}
(4)
Stopwatch stopwatch = new Stopwatch();
for (int i = 0; i < 5; i++)
{
stopwatch.Restart();
while (true)
{
if (stopwatch.ElapsedMilliseconds >= 300)
{
break;
}
}
stopwatch.Stop();
myInt++;
display();
}
所有使用該:
private void display()
{
myListView.Items.Clear();
myListView.Items.Add(new ListViewItem(new[] { myInt }));
}
(1)和(2)由5遞增的數量,但顯示不被更新的。它會顯示何時通過其他功能更新顯示。 (3)和(4)將數字增加5,但顯示僅在約1500ms後更新,顯示跳過單個步驟並僅顯示最終結果(例如15)。
任何建議,使其工作?我可以強制刷新display()函數嗎?
爲什麼t.Wait();導致異常? (我發現任務代碼某處網)
編輯:
(5)
private void team_comm_btn_all_Click(object sender, EventArgs e)
{
for (int i = 0; i < 5; i++)
{
await Run(i); //error 74 see below
}
}
private async Task Run(int i)
{
myInt++;
display();
await Task.Delay(300);
}
伺機運行(我);給出以下內容: 錯誤74'await'操作符只能在異步方法中使用。考慮使用「異步」修飾符標記此方法,並將其返回類型更改爲「任務」。
只是在執行「Run(i)」而不是提示「await」已丟失......在這種情況下,它編譯並遞增5,沒有任何延遲。
(6)
private void team_comm_btn_all_Click(object sender, EventArgs e)
{
for (int i = 0; i < 5; i++)
{
var task = Task.Run(async() =>
{
await Run(i);
});
}
}
private async Task Run(int i)
{
myInt++;
display();
await Task.Delay(300);
}
遞增5,但完全不更新顯示。
http://stackoverflow.com/questions/19028374/accessing-ui-controls-in-task-run-with-async-await- winform –
那個線程並不包括我試過的所有東西,而且我沒有發現任何東西來解決我的問題(請參閱上面的編輯)。儘管它確實提高了我對任務的理解=) – letsdance
是的,沒有投票結束重複,因爲我不確定它是否是同一個問題。自異步發佈之前很久以來,還沒有完成WinForms。事實上,「沒有」發生,然後你突然看到最終值感覺就像沒有處理Windows消息隊列。如果你願意,你會得到這種行爲。有一個循環在正常的事件處理程序中更新UI。不知道具體情況如何適用於你的情況。 –