2016-05-26 3 views
0

この投稿の件名と同様に、誰でも私に非同期メソッドで起動されたイベントを処理する最良の方法をC#で提案できますか?C#で待ち受け可能なメソッドでイベントを処理するために使用するパターン#

// Before: 
MyPosClass.EventBluetoothCommunicationCompleted+= (sender, ErrorCode) => 
      { 
       // implementation on event fired 
      }; 

// After: 
var result = await MyPosClass.WaitBluetoothCommunicationCompleted(); 

私はこの答え Await async with event handler はそれが解決策になることができ気づきましたか?

ありがとうございました! Lewix

+0

これに対する答えは[this](http://stackoverflow.com/q/12865848/14357)の質問です。 'TaskCompletionSource'を使用してください。 – spender

+0

あなたはあなたの問題をより良く/明確に述べ、正確に何を解決したいのですか? –

+0

私は、アプリからモバイルPOSへのブルートゥース経由でcomunicateするためのインターフェースを実装しました。今私はクラスを実装するために取り組んでいると私はそれが通信が完了し、完了するまで待つ単純なメソッドを公開したいと思います。 @spenderの解決策です!ありがとう –

答えて

0

@spenderのソリューションが最もクリーンなようです。この改善TaskCompletionSource throws "An attempt was made to transition a task to a final state when it had already completed"General purpose FromEvent method

今私のawaitable方法 は次のようになります。

public Task<TransactionData> PerformTransactionAwait() 
{ 
    var tcs = new TaskCompletionSource<TransactionData>(); 

    EventHandler<TransactionInfo> callback = null; 
    callback = (sender, TransactionDataResult) => 
    { 
     MyInterface.TransactionPerformed -= callback; 
     tcs.SetResult(TransactionDataResult); 
    }; 

    MyInterface.TransactionPerformed += callback; 
    MyInterface.PerformTransactionAsync(); 

    return tcs.Task; 
} 

ありがとうございます! Lewix

+0

メモリリークを回避し、メソッドをより一度ここに感謝するように改良http://stackoverflow.com/questions/31787840/taskcompletionsource-throws-an-attempt-was-made-to-transition-a-task-to -a-final –

+0

これは境界線[リンクのみの回答](http://meta.stackexchange.com/q/8231/213671)です。ここに多くの情報を含めるように答えを広げ、参照用にのみリンクを使用してください。 – gunr2171

+0

あなたは正しいです、私は私の答えを更新します –

関連する問題