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)
如果没有用执行标志来污染被调用的类,我会感激任何帮助,想出一个干净的模式来完成这个任务.
如果可以(特别是,如果您使用的是.NET 4),请CallAsyncMethod返回a 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
}
Run Code Online (Sandbox Code Playgroud)
C#5中的新异步功能旨在与之配合使用Task<T>,因此您可以随时使用新版本.