私は現在、機能をブロックし、イベントがトリガーするのを待つことに問題があります。私のコードは以下の通りです: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ストアアプリです。
は
おかげスティーブン!それはコンパイルエラーを解決しました。しかし、実行しようとすると、tcs.Taskがまだ設定されていなくても、WaitForInputEventはすでに戻ります。それは本当に意図された動作ですか?私はそれが入力を待つことを望んでいた。たとえば、Javascript(Chakraを使用)では、WaitForInputEventを呼び出すと、スワイプが実行されるまでJSコードを処理しません。 – Water
@ Water:私の['async'イントロ](http://blog.stephencleary.com/2012/02/async-and-await.html)が役に立つかもしれません。非同期コードの全ポイントは、完了する前に戻ることができることです。しかし、asyncメソッドが返す* task *は 'tcs.Task'が完了するまで完了しません。したがって、 'WaitForInputEvent'を' await'で消費すると、メソッドは完了するまで「非同期に待機」します(待ちます)。 –
ステファンありがとう!私はJavascript側の約束を使って動作させました。 – Water