我有一个控制台应用程序,它执行一个类方法(在另一个项目中)。 此方法异步执行对Web服务的POST(这是3分钟的冗长操作)并且具有回调,该回调返回受POST影响的记录数。与此同时,程序继续执行其他需要不到3分钟的事情,程序在回调返回之前退出。
过去我使用了如下所示的ManualResetEvent来防止完成,但在这种情况下,我的方法是在一个不同的类库中,我希望尽可能保持干净。
static ManualResetEvent resetEvent = new ManualResetEvent(false)
static void Main()
{
CallAsyncMethod();
// Do other things...
resetEvent.WaitOne(); // Blocks until "set"
}
void AsyncMethodCallback()
{
// Do processing on completion...
resetEvent.Set(); // Allow the program to exit
}
我很感激任何帮助,想出一个干净的模式来完成这个,而不会用执行标志污染被调用的类。
答案 0 :(得分:5)
如果可以(特别是,如果您使用的是.NET 4),请让CallAsyncMethod
返回Task
或Task<T>
。然后,您可以轻松附加延续,等待它完成等。如果回调的唯一目的是获取记录数,则返回Task<int>
将是理想的。您可以使用TaskCompletionSource<TResult>
,因此在async方法中很容易填充结果,因此您不需要主类中的回调,这将有一个主方法,如:
static void Main()
{
Task<int> asyncTask = CallAsyncMethod();
// Do other things...
int count = asyncTask.Result;
// Do anything you need with the count
}
C#5中的新异步功能旨在与Task<T>
配合使用,因此您可以随时使用新版本。
答案 1 :(得分:1)
在另一个前台线程上启动webservice请求。在所有前台线程完成执行之前,应用程序不会退出。
new Thread(() => CallSynchronousMethod()).Start();