0

結果を待つ別のメソッドでラップしたい非同期メソッドを持つサードパーティの DLL があります。

機能を非表示にするクラスを書き始めましたがDoc.Completed、後で DLL によって呼び出されるのthis.version.DownloadFile(this)を待つ方法がわかりませんDoc.Download

DLL は を呼び出しInitTransfer、その後OnProgressNotify何度か呼び出しますCompletedOnErrorどの段階でも呼び出すことができますが、Completed常に最後に呼び出されます。InitTransferOnProgressNotifyまたはは気にしませんOnError

同期メソッドでの非同期呼び出しと非同期呼び出しを同期に変えるを読み ましたが、このケースへの回答を適用する方法がわかりません。

私はC#4を使用しています。

public class Doc : SomeInterfaceFromTheDll
{
  private readonly IVersion version; // An interface from the DLL.

  private bool downloadSuccessful;

  public Doc(IVersion version)
  {
    this.version = version;
  }

  public bool Download()
  {
    this.version.DownloadFile(this);
    return ??? // I want to return this.downloadSuccessful after Completed() runs.
  }

  public void Completed(short reason)
  {
    Trace.WriteLine(string.Format("Notify.Completed({0})", reason));
    this.downloadSuccessful = reason == 0 ? true : false;
  }

  public void InitTransfer(int totalSize)
  {
    Trace.WriteLine(string.Format("Notify.InitTransfer({0})", totalSize));
  }

  public void OnError(string errorText)
  {
    Trace.WriteLine(string.Format("Notify.OnError({0})", errorText));    
  }

  public void OnProgressNotify(int bytesRead)
  {
    Trace.WriteLine(string.Format("Notify.OnProgressNotify({0})", bytesRead));
  }
}  
4

1 に答える 1

1

これは、以下に示すように、ManualResetEvent を使用して実現できます。ただし、いくつかの注意事項があります。主な問題は、このメカニズムでは、複数のスレッドで同じインスタンスをDownload()同時に呼び出す ことができないことです。Docこれを行う必要がある場合は、別のアプローチが必要になる場合があります。

public class Doc : SomeInterfaceFromTheDll
{
  private readonly IVersion version; // An interface from the DLL.
  private readonly ManualResetEvent _complete = new ManualResetEvent(false);

  private bool downloadSuccessful;

  // ...

  public bool Download()
  {
    this.version.DownloadFile(this);
    // Wait for the event to be signalled...
    _complete.WaitOne();
    return this.downloadSuccessful;
  }

  public void Completed(short reason)
  {
    Trace.WriteLine(string.Format("Notify.Completed({0})", reason));
    this.downloadSuccessful = reason == 0;
    // Signal that the download is complete
    _complete.Set();
  }

  // ...
}  
于 2012-07-31T07:31:16.187 に答える