我有一個在 .net 6 上運行的 WPF 應用程式和一個連接到它的外部設備。
初始化設備有時會失敗,我不想讓 UI 執行緒嘗試初始化它。
我想以異步方式運行以下方法 (_device.Init()),當它回傳 true 時,運行 Start() 方法。
編輯:運行它直到它從 _device.Init() 方法回傳 true,而不是完成任務
是否有內置功能可以處理任務?或任何其他“最佳實踐”方式?
謝謝 :)
SomeDevice _device = new();
public async void Init()
{
// some other code
while (Task.Run(() => _device.Init()).Result == false)
{
}
Start();
}
public void Start()
{
// some other code
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
_device.Start();
}));
}
uj5u.com熱心網友回復:
而不是獲取Result任務(這可能會阻塞 UI 執行緒),你應該await任務:
public async void Init()
{
// some other code
while (!await Task.Run(() => _device.Init()))
{
}
Start();
}
該方法也應該是可等待的并且在被呼叫時被等待,例如在異步加載事件處理程式中:
public async Task Init()
{
// some other code
while (!await Task.Run(() => _device.Init()))
{
}
Start();
}
...
await Init();
uj5u.com熱心網友回復:
public async void Init()
{
var task = _device.Init();
//do work here
await task;
Start();
}
應該做的伎倆,它會做的作業,然后等待任務完成再去Start();
如果您只想等待 init 完成然后運行 ??start 它更簡單
await _device.Init().ContinueWith((x) => { Start();})
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/513327.html
上一篇:關于SVG到DrawingImage轉換的WPF查詢
下一篇:異步函式按順序運行WPF
