控制台应用程序在执行回调之前退出

时间:2012-04-17 20:00:56

标签: c# c#-4.0 asynchronous callback manualresetevent

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

我很感激任何帮助,想出一个干净的模式来完成这个,而不会用执行标志污染被调用的类。

2 个答案:

答案 0 :(得分:5)

如果可以(特别是,如果您使用的是.NET 4),请让CallAsyncMethod返回TaskTask<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();