在void方法内部使用异步等待

本文关键字:异步 等待 内部 void 方法 | 更新日期: 2024-09-22 21:36:47

我有一个带有签名的方法,无法更改。应该是

protected override void OnInitialize()

使用Windows8 Metro API,我需要在NoSignatureChange方法中检查文件是否存在并读取它。使用PlainOldCSharp,我会写一些类似的东西

protected override void OnInitialize()
{
  ...
  try
  {
    var file = folder.OpenFile(fileName);
    fileExists=true;
  }
  catch(FileNotFoundException)
  {
    fileExists=false
  }
}

请记住,在Windows 8 API中,检查文件是否存在的唯一方法是处理FileNotFoundException此外,在Windows8 API中,所有的FileIO API都是异步的,所以我只有文件。OpenFileAsync方法。

因此,问题是:我应该如何使用文件夹编写此代码。Windows 8 API中的OpenFileAsync方法,不更改包含方法的签名

在void方法内部使用异步等待

您仍然可以使void方法异步:

protected async void CannotChangeSignature()
{
    ...
}

异步方法的有效返回类型为:

  • void
  • Task
  • Task<T>

然而,如果你想让实际上屏蔽,那么你基本上是在与平台对抗——关键是避免阻塞。

你说你不能更改签名,但如果你依赖这种阻止,那么你就有来改变你处理编码的方式。

理想情况下,您应该将签名更改为Task<bool>:

protected async Task<bool> CannotChangeSignature()
{
  ...
  try
  {
    await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
    return true;
  }
  catch(FileNotFoundException)
  {
    return false;
  }
}

编辑:如果真的需要一个阻塞,您只需要调用AsTask().Wait(),捕获AggregateException并检查它是否包含FileNotFoundException。这真的很可怕。。。你能不能不围绕这个进行设计,这样它就不需要阻塞了?例如,开始检查文件,并在发现它不存在时显示错误(或其他任何错误)。

    public async void CalculateData()
    {
        await ProcessData();
    }
    private async Task ProcessData()
    {
        await Task.Run(() =>
        {
            //time taking process
        });
    }

或者你可以使用

public void CalculateData()
{
    ProcessData();
}
private async void ProcessData()
{
    await Task.Run(() =>
    {
        //time taking process
    });
}