0

我有一个带有异步方法的第 3 方 DLL,我想用另一个等待其结果的方法包装它。

我开始编写一个类来隐藏功能,但现在我不知道如何Doc.Completedthis.version.DownloadFile(this).Doc.Download

DLL 调用InitTransfer,然后OnProgressNotify多次,然后Completed. OnError可以在任何阶段调用,但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 回答