2016-07-01 32 views
0

我剛開始玩我的新鮮樹莓派3和Win10 IOT。方法not awaiting /異步(UWP + Rpi3)

我嘗試了一個小項目,但遇到了異步/等待語句的一些問題。

我不是新來的C#,也不是await /異步,但這是我第一次與UWP,所以我可能會錯過這個平臺比較WinForms/WPF環境的一些技巧。

(僅供參考,我沒有訪問Win10 DEVELOPPEMENT機的時刻,所以下面的代碼片段可能無法編譯馬上)


下面是在一具無頭應用標準模板RPI:

public async void Run(IBackgroundTaskInstance taskInstance) 
{ 
    taskInstance.GetDeferral(); 

    await DoSomethingAsync(); 

    // Other irrevelant stuff then... 

    defferal.Complete(); 
} 

然後異步方法:

private async Task DoSomethingAsync() 
{ 
    // Something done async 
    await Task.Delay(1000); 
} // <--- Hangs here 

將應用程序部署到Pi時,它會輸入DoSomethingAsync方法並無問題地執行其內容。

我的問題是,應用程序掛在退出分號。

我們是否需要使用CoreDispatcher,ThreadPool或簡單的new TaskFactory().StartNew(async() => { await DoSomethingAsync(); });

我不明白的是使用await/async應該在其他線程上執行我的方法,但它掛起的方式就好像它正在等待UI來處理消息隊列(這裏是WinForms/WPF背景:))

預先感謝您。

編輯:這段代碼如果我刪除所有異步的東西,使其同步運行的作品。

+0

你是什麼意思「掛起」和什麼退出分號?順便說一句,你*不需要提供任何額外的東西。在任何情況下,'await' *等待*異步方法的完成,它不會使異步方法自動異步 –

+1

'我不明白的是使用await /異步應該在另一個線程上執行我的方法'如果您需要在另一個線程完成工作,則不應使用「await」。 「等待」將等待通話結束。 – jackjop

+0

@PanagiotisKanavos,我編輯了我的問題,並評論它懸掛哪一個右括號。我的意思是說,當我一步一步地做,它不會走得更遠。 – Panda

回答

0

我沒有看到你的代碼上defferal完成()方法,試試這個:

public async void Run(IBackgroundTaskInstance taskInstance) 
{ 
    BackgroudTaskDefferal defferal = taskInstance.GetDeferral(); 

    await DoSomethingAsync(); 

    // Other irrevelant stuff then... 

    defferal.Complete(); 
} 

,可能與懸掛,即異步操作完成應用程序的等待信號的問題。

+0

我編輯了我的問題,我沒有包含'defferal.Complete();',因爲它在此之前掛起。 – Panda

+0

有趣的是,現在看起來不錯,我的應用程序中的代碼幾乎相同。你會收到一些錯誤,或者只是「凍結」?是不是在你的異步代碼非常持久? –

+0

沒有錯誤(但我沒有等待超過10秒)。這是一個UWP,所以我今天晚上在PC上試試它,而不是部署在Rpi上。真正的異步代碼只將'DateTime.Now.ToString()'寫入文件中。 – Panda

0

如果刪除所有的斷點,加上調試日誌像

`System.Diagnostics.Debug.WriteLine` 

調試消息將顯示一切工作都很好。

僅當您使用VS進行遠程調試時纔會發生掛起。

我建議你打開一個用戶語音請求。

+0

對,我還沒有嘗試沒有斷點/調試器連接。我會試試這個。 – Panda

+0

它怎麼樣? – Jackie

+0

我還沒有時間去測試它(更像是一個側面的愛好項目,而不是專業的:)) – Panda