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>/voidreturn类型一起使用.它 不能 与任何其他 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();
}