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