2017-02-20 298 views
-1

我的代碼正確編譯,但在收到警告稱爲C#Winform的:與異步長時間運行操作等待

這種異步方法缺乏「等待」運營商和將同步運行。 考慮使用'await'操作符來等待非阻塞API調用 或'await Task.Run(...)'在後臺線程上執行CPU綁定工作。

private async void Form1_Load(object sender, EventArgs e) 
    { 
     //await longRunningRoutine(); 

     await Task.Run(async() => 
     { 
      await longRunningRoutine(); ; 
     }); 
     label1.Text = "hello test"; 

    } 

    public async Task longRunningRoutine() 
    { 
     await Task.Delay(10000); 
    } 

所以告訴我什麼是缺乏在我的代碼爲這我得到的警告? 如何解決這個問題。謝謝

+0

'longRunningRoutine()'實際上做了什麼? –

+2

用'await Task.Delay(10000);' – Equalsk

+0

替換睡眠您的異步方法(longRunningRoutine)缺少等待操作符並將同步運行... – Evk

回答

2

異步調用的睡眠。如果你沒有一個awaitable方法,以等待(你沒有),你將有創建一個Task來運行它,並等待該任務:

private async void Form1_Load(object sender, EventArgs e) 
{ 
    await Task.Run(() => longRunningRoutine()) 
} 

public void longRunningRoutine() 
{ 
    System.Threading.Thread.Sleep(10000); 
} 
1

警告說你正在異步調用longRunningRoutine但這種方法沒有任何類型的異步請求。
爲了解決這個警告,您需要同步調用該方法,或者您需要使用Task.Delay

+0

我會想象OP實際上並不想調用Sleep() - 他只是用它來模擬需要一些時間的同步操作。 –

+0

我同意你的觀點(因爲這個原因,我提高了你的答案),但是因爲他問他爲什麼會得到這個錯誤,我只寫了一個解釋和兩個可能的解決方法(第三個已經由你發佈)。 – Tinwor

1

longRunningRoutine方法已經是異步的 - 這樣你就可以刪除Task.Run這不僅浪費額外的線程

private async void Form1_Load(object sender, EventArgs e) 
{ 
    await longRunningRoutine(); 
    label1.Text = "hello test"; 
} 

然後按照慣例建議通過添加..Async後綴來重命名方法 - 讀取代碼時可以節省您幾秒鐘的時間。