0

我有一个执行类方法的控制台应用程序(在不同的项目中)。此方法异步执行到 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
}

我将不胜感激提出一个干净的模式来实现这一点,而不会用执行标志污染被调用的类。

4

2 回答 2

5

如果可以(特别是,如果您使用的是 .NET 4),请CallAsyncMethod返回 aTaskTask<T>. 然后您可以轻松地附加一个延续,等待它完成等。如果回调的唯一目的是获取记录数,那么返回 aTask<int>将是理想的。您可以TaskCompletionSource<TResult>在异步方法中非常轻松地使用这样的填充结果,因此您根本不需要在主类中使用回调,主类将具有类似的主方法:

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>.

于 2012-04-17T20:06:37.433 回答
1

在另一个前台线程上启动 web 服务请求。在所有前台线程完成执行之前,应用程序不会退出。

new Thread(() => CallSynchronousMethod()).Start();
于 2012-04-17T20:12:32.600 回答