我正在嘗試不斷運行代碼,以盡可能快地執行一個函式(除非有指定的速率。)當我之前使用 d java 時,有一個調度程式或計時器,我曾經使用它來不斷運行代碼在一定的延遲內,沒有多執行緒。我正在尋找類似的東西,但沒有延遲。
我已經嘗試過多執行緒,然后使用 while 回圈,用 thread.sleep 添加可選的延遲,然后呼叫一個方法回到主執行緒。這個問題是它凍結了我的行程,并導致它在任務管理器中“沒有回應”。盡管它不會中斷主執行緒,這意味著它按預期運行,渲染所有內容,但它使任務“無回應”,這使我無法與最大化、關閉按鈕、調整大小等進行互動。這是我的多執行緒代碼。
public void Init()
{
Thread thread = new Thread(Loop);
thread.Start();
}
public void Loop()
{
while (true)
{
if (InvokeRequired)
{
this.BeginInvoke(new MethodInvoker(delegate { RenderFrame(); }));
}
if (maxFps > 0)
{
Thread.Sleep(1000 / maxFps);
}
}
}
如果有人知道我如何在不凍結行程的情況下獲得相同的結果,或者在沒有多執行緒的情況下做到這一點,請給我一些指示!
編輯:我決定只使用計時器,它會稍微慢一些,但沒關系,我想。不過,最后一個問題是,有時當關閉或單擊 winform 時,我的回圈結束,并且它停止呼叫渲染函式。我正在使用這個:
var timer = new System.Threading.Timer((e) =>
{
this.BeginInvoke(new MethodInvoker(delegate { RenderFrame(); }));
}, null, 0, 1);
uj5u.com熱心網友回復:
您正在啟動一個除了用數百萬條訊息轟炸 UI 訊息回圈之外什么都不做的執行緒。這不是一個很好的執行緒使用。當您需要做與 UI 無關的作業時,您需要一個后臺執行緒,并且在您的情況下,似乎所有作業都與操作 UI 組件相關聯。所以所有的作業都應該發生在 UI 執行緒上。為了在無限回圈運行時保持 UI 回應,您可以將 轉換Loop為async方法(async Task或async void),并將其替換Thread.Sleep()為await Task.Delay():
public void Init()
{
Loop();
}
public async void Loop()
{
while (true)
{
RenderFrame();
if (maxFps > 0)
await Task.Delay(1000 / maxFps);
else
await Task.Yield();
}
}
而不是while (true)您可以檢查主表單仍然打開的條件,否則回圈將在關閉表單后繼續,很可能導致ObjectDisposedException.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/523270.html
標籤:C#多线程表格
上一篇:Vue 腳手架編程
下一篇:std::condition_variable不適用于std::this_thread::sleep_for()
