11

我有无法更改的签名方法。它应该是

protected override void OnInitialize()

使用 Windows 8 Metro API,我需要在这个 NoSignatureChange 方法中检查文件是否存在并读取它。使用 PlainOldCSharp,我会写类似

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

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

所以,问题是:我应该如何在 Windows 8 API 中使用 folder.OpenFileAsync 方法编写这段代码而不改变包含方法的签名

4

2 回答 2

22

您仍然可以使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. 不过,这真的很可怕……你能不能围绕它进行设计,这样它就不需要被阻塞了?例如,开始检查文件,并在发现文件不存在时显示错误(或其他)。

于 2012-08-03T21:15:29.307 回答
-1
    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
    });
}
于 2021-08-12T17:53:09.463 回答