2

をぶら下げ:非同期タスク、私は次のコードを持っている

public async Task SendPushNotificationAsync(string username, string message) 
{ 
    var task = ApnsNotifications.Instance.Hub.SendAppleNativeNotificationAsync(alert, username); 
    if (await Task.WhenAny(task, Task.Delay(500)) == task) { 
     return true; 
    } 
    return false; 
} 

を私は(含むメソッドの外に返すことはありません)SendAppleNativeNotificationAsyncが無期限にハングしていることに気づいたので、私は500msの後にキャンセルし、それを言ってみました。しかし、まだ... WhenAnyへの呼び出しは現在、ハングし、私は消費者だけで無期限に待機し、その結果、return GETヒットを見ることはない(それは、この非同期メソッドを呼び出して同期する方法ですので、私は.WAIT()を呼び出し):

_commService.SendPushNotificationAsync(user.Username, notificationDto.PushContent).Wait(TimeSpan.FromSeconds(1)); 

どのようにして設定時間後にこれを強制終了するのですか?

タスクを実行する代わりにawaitの代わりに単に「火をつけて忘れる」とはどうなりますか?

+0

このコードはどこで実行しますか?私は、Webアプリケーション、デスクトップアプリケーション、おそらくモバイル? – Evk

+0

@Evkこれは、WebApiコントローラによって呼び出される同期サービスメソッドから呼び出されるサービスメソッドにあります。 – SB2055

+2

"UI"または "request"スレッドを持つ環境でWait(またはTask.Result)をasync \ awaitと一緒に使用しないでください。あなたが観察したようにデッドロックします。 – Evk

答えて

5

それは、この非同期メソッドを呼び出して同期する方法ですので、私は

).WAIT(呼び出し、それはあなたの問題です。あなたはdeadlocking because you're blocking on asynchronous codeです。

このための最善の解決策ではなくWaitawaitを使用することです:

await _commService.SendPushNotificationAsync(user.Username, notificationDto.PushContent); 

あなたは絶対は、あなたが私のBrownfield Async articleで説明したハックのいずれかを試すことができ、awaitを使用できない場合。

+0

ありがとうございます。 'await'を使用し、' SendAppleNativeNotificationAsync'が決して返ってこない場合、私は大丈夫でしょうか? – SB2055

+0

@ SB2055:なぜそれは戻ってきませんか? –

+0

私はデバッガから見ている振る舞いに基づいています - 私は決して 'return'を捕まえることはできませんが、別のスレッドがそれを拾っているからでしょうか? – SB2055

関連する問題