.net 何时使用AsyncOperation和AsyncOperationManager

.net 何时使用AsyncOperation和AsyncOperationManager,.net,asynchronous,.net,Asynchronous,今晚我花了很多时间阅读关于实现基于事件的异步模式的内容 不幸的是,我还没有找到任何关于编写只支持一个异步调用的类的文章 我看到的每个示例都假设一个方法调用将被多次调用,因此,应该将userState对象传递到MethodNameAsync 您将看到,MS在本文的第三个要点中提到了这一点 在“同时执行操作”标题下 但我很困惑。我应该使用AsyncOperation和AsyncOperationManager类来实现异步功能,其中一个方法一次只能由一个线程调用吗 一个链接也不错:) 谢谢CodePr

今晚我花了很多时间阅读关于实现基于事件的异步模式的内容

不幸的是,我还没有找到任何关于编写只支持一个异步调用的类的文章

我看到的每个示例都假设一个方法调用将被多次调用,因此,应该将userState对象传递到MethodNameAsync

您将看到,MS在本文的第三个要点中提到了这一点 在“同时执行操作”标题下

但我很困惑。我应该使用AsyncOperation和AsyncOperationManager类来实现异步功能,其中一个方法一次只能由一个线程调用吗

一个链接也不错:)


谢谢

CodeProject的这篇文章清楚地解释了您问题的答案:

首先,我们需要说明什么是同步上下文。
同步上下文是一个类,它决定应该执行哪些线程操作。
主同步上下文类SynchronizationContext和WindowsFormsSynchronizationContext只是简单的类,可以将操作委托给其他线程。
SynchronizationContext.Post()方法仅将操作委托给线程池中的某个线程(内部使用ThreadPool.QueueUserWorkItem(…)方法)。
SynchronizationContext.Send()方法仅在同一线程中执行委托。
WindowsFormsSynchronizationContext最常用的用法如下:当您创建应用程序的主窗体时,WindowsFormsSynchronizationContext在内部为主GUI线程设置。稍后,此同步上下文用于在同一GUI主线程上执行委托

所以,我将得出结论,同步上下文是一个简单的类,它决定委托将在哪个线程上执行

现在,让我们回到AsyncOperationManager类。
当需要在某些同步上下文上执行操作时,可以使用AsyncOperationManager类。将在其上执行操作的下一个同步可以是:

1) 如果线程定义了SynchronizationContext,则与调用AsyncOperationManager.CreateOperation()方法的同步上下文相同。

2) 如果当前线程尚未定义同步上下文,则创建新的同步上下文(由基本SynchronizationContext类的新实例表示)。正如我前面所说的,BaseSynchronizationContext类的实例将在线程池中的某个线程上执行委托

基本上,AsyncOperationManager只是一个简单的助手类,它在内部使用AsyncOperation和SynchronizationContext类

现在,关于使用场景。
例如,在主GUI线程中,您创建了一个类,该类使用基于事件的异步模式提供异步操作(即,它提供报告进度的事件)。
您希望事件处理程序在同一GUI线程中执行,以便能够从事件处理程序使用GUI控件。
在本例中,在OperationAsync方法中,您将创建一个AsyncOperation对象并将其存储以供以后使用:

public void OperationAsync(object arg1, object arg2, ...)
{
  _asyncOperation = AsyncOperationManager.CreateOperation(null);
  /* _asyncOperation object now captured current synchronization 
     context, which is WindowsFormsSynchronizationContext if you 
     run this method from GUI thread. */
  ...
}
当操作完成时,使用AsyncOperation.Post()方法引发OperationCompleted事件。如果从应用程序的GUI线程运行AsyncOperationManager.CreateOperation()方法,则事件处理程序将在同一线程上执行,即在主GUI线程上执行:

private void OnOperationCompleted(AsyncCompletedEventArgs e)
{
  EventHandler<AsyncCompletedEventArgs> handler = OperationCompleted;
  if(handler != null)
  {
    _asyncOperation.Post(
      delegate
      {
        handler(this, e);
      },
      null);

    _asyncOperation.OperationCompleted();
  }
  ....
}
private void OnOperationCompleted(AsyncCompletedEventArgs e)
{
EventHandler=操作已完成;
if(处理程序!=null)
{
_异步操作.Post(
代表
{
处理者(本,e);
},
无效);
_asyncOperation.OperationCompleted();
}
....
}

语言/平台?我猜是.NET,但请添加一个关键字