C# 块功能和等待事件触发。还使用异步 IAsyncOperation
C# Block function and Wait for Event to trigger. Also using async 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循环。
我尝试使用 async void,它工作正常。不过,我还是想return 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 找到合适的 return 类型,因此它不允许编译。我们在 Instance_Swipe.
上触发任务完成源
谁能推荐最好的方法是什么?这是一个通用 Windows 商店应用程序。
谢谢
async
关键字必须与Task
/Task<T>
/void
return类型一起使用.它 不能 与任何其他 return 类型一起使用(目前)。
因此,要解决您的问题,您只需将代码拆分为两种方法:一种是 returns Task<T>
并使用 async
,另一种是 returns IAsyncOperation<T>
:
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();
}
我目前在阻止功能和等待事件触发时遇到问题。下面是我的代码:
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循环。
我尝试使用 async void,它工作正常。不过,我还是想return 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 找到合适的 return 类型,因此它不允许编译。我们在 Instance_Swipe.
上触发任务完成源谁能推荐最好的方法是什么?这是一个通用 Windows 商店应用程序。
谢谢
async
关键字必须与Task
/Task<T>
/void
return类型一起使用.它 不能 与任何其他 return 类型一起使用(目前)。
因此,要解决您的问题,您只需将代码拆分为两种方法:一种是 returns Task<T>
并使用 async
,另一种是 returns IAsyncOperation<T>
:
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();
}