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メソッドしかありません。

したがって、質問は次のとおりです。包含メソッドの署名を変更せずに、Windows8APIで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 に答える