2016-09-16 16 views
0

私は現在、機能をブロックし、イベントがトリガーするのを待つことに問題があります。私のコードは以下の通りです:C#ブロック機能とイベント待ちトリガ。また、非同期IAsyncOperationを使用して

bool isNotSwiped = true; 
    bool isNotCancel = true; 
    public Foo WaitForInputEvent(string strEventType, string PromptFor) 
    { 
     Foo ret = new Foo(); 

     MSR.MSR.Instance.Swipe += Instance_Swipe; 

     while (isNotSwiped && isNotCancel) 
     { 
      Task.Run(async() => await Task.Delay(1000)); 
     } 

     (ret as Foo).MSRData = SwipeData; 

     return ret; 
    } 

    public Foo SwipeData { get; set; } 

    private void Instance_Swipe(object sender, Windows.Devices.PointOfService.MagneticStripeReaderBankCardDataReceivedEventArgs e) 
    { 
     isNotSwiped = false; 

     SwipeData = new Foo(); 

     (SwipeData as Foo).MSRData = CreateExtensibilityMagneticStripeReaderCardDataFromBankCard(e); 

     MSR.MSR.Instance.Swipe -= Instance_Swipe; 
    } 
     (ret as Foo).MSRData = SwipeData; 

     return ret; 
    } 

    public MSRInputEventArgs SwipeData { get; set; } 

    private void Instance_Swipe(object sender, Windows.Devices.PointOfService.MagneticStripeReaderBankCardDataReceivedEventArgs e) 
    { 
     isNotSwiped = false; 

     SwipeData = new MSRInputEventArgs(); 

     (SwipeData as MSRInputEventArgs).MSRData = CreateExtensibilityMagneticStripeReaderCardDataFromBankCard(e); 

     MSR.MSR.Instance.Swipe -= Instance_Swipe; 
    } 

私がカードをスワイプすると、Instance_Swipeメソッドは起動しません。おそらくそれはwhileループのためです。

私は非同期voidを使ってみましたが、正常に動作しました。しかし、私はまだFooを返そうと思っています。タスクを使用できないように、Windowsランタイムで作業しています。以下は、私が試してみました別の実験である:

private TaskCompletionSource<Foo> tcs = new TaskCompletionSource<Foo>(); 
    public async IAsyncOperation<Foo> WaitForInputEvent(string strEventType, string PromptFor) 
    { 
     Foo ret = new Foo(); 

     MSR.MSR.Instance.Swipe += Instance_Swipe; 
     await tcs.Task; 

     (ret as Foo).MSRData = LastSwipedData; 

     IAsyncOperation<Foo> test = tcs.Task.AsAsyncOperation<Foo>(); 

     //cannot find correct cast/return here 
     return test; 
    } 

問題があり、私はそれをコンパイルすることはできませんので、非同期IAsyncOperationのための適切な戻り値の型を見つけるように見えることはできません。 Instance_Swipeでタスク完了ソースをトリガーします。

誰にでも最高のアプローチが推奨されますか?これは、ユニバーサルWindowsストアアプリです。

答えて

2

Task/Task<T>/void戻り値の型を使用する必要がありますasyncキーワードをいただき、ありがとうございます。それ以外の返品タイプ(まだ)で使用することはできません。

だから、あなたの問題を解決するために、あなただけの二つの方法にコードを分割する必要があります。Task<T>を返し、asyncを使用しています1、およびIAsyncOperation<T>を返す1:

private async Task<Foo> DoWaitForInputEventAsync(string strEventType, string PromptFor) 
{ 
    Foo ret = new Foo(); 

    MSR.MSR.Instance.Swipe += Instance_Swipe; 
    await tcs.Task; 

    (ret as Foo).MSRData = LastSwipedData; 

    return ret; 
} 

public IAsyncOperation<Foo> WaitForInputEvent(string strEventType, string PromptFor) 
{ 
    return DoWaitForInputEventAsync(strEventType, PromptFor).AsAsyncOperation(); 
} 
+0

おかげスティーブン!それはコンパイルエラーを解決しました。しかし、実行しようとすると、tcs.Taskがまだ設定されていなくても、WaitForInputEventはすでに戻ります。それは本当に意図された動作ですか?私はそれが入力を待つことを望んでいた。たとえば、Javascript(Chakraを使用)では、WaitForInputEventを呼び出すと、スワイプが実行されるまでJSコードを処理しません。 – Water

+1

@ Water:私の['async'イントロ](http://blog.stephencleary.com/2012/02/async-and-await.html)が役に立つかもしれません。非同期コードの全ポイントは、完了する前に戻ることができることです。しかし、asyncメソッドが返す* task *は 'tcs.Task'が完了するまで完了しません。したがって、 'WaitForInputEvent'を' await'で消費すると、メソッドは完了するまで「非同期に待機」します(待ちます)。 –

+0

ステファンありがとう!私はJavascript側の約束を使って動作させました。 – Water

関連する問題