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

Die*_*ego 0 c# asynchronous callback manualresetevent c#-4.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
}
Run Code Online (Sandbox Code Playgroud)

如果没有用执行标志来污染被调用的类,我会感激任何帮助,想出一个干净的模式来完成这个任务.

Jon*_*eet 5

如果可以(特别是,如果您使用的是.NET 4),请CallAsyncMethod返回a 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
}
Run Code Online (Sandbox Code Playgroud)

C#5中的新异步功能旨在与之配合使用Task<T>,因此您可以随时使用新版本.