所以你已经描述了你如何在客户端上进行异步调用,实际上还有一些问题,我会问你如何在那里完全异步,但是你的问题似乎更多的是关于如何在服务方面尽可能高效,对吗?
如果您在服务操作中执行长时间运行或I/O绑定操作,那么您必须必须开始利用WCF对asynchronous service operations的支持。现在,有很多方法可以做到这一点,但是如果您使用.NET 4.0,则没有比使用Task Parallel Library(TPL)更好的方法。
首先,通过将工作卸载到TPL线程,释放WCF I/O线程来处理更多的调用。这样,长时间运行的WCF操作不会影响WCF执行其他操作的能力。
其次,TPL默认使用线程池。你不必担心每一个操作都在旋转它自己的线程,并最终导致资源耗尽。 TPL还足够聪明,可以在没有大量投资编写管道代码的情况下,以更高效的方式将工作分散到盒子上的所有核心。
第三,the TPL can be combined with the traditional Asynchronous Programming Model (APM)所以,如果你与像Streams
事物(网络或文件),则可以使用自己的BeginRead/Write
方法利用异步I/O,以将腾出CPU线程而阻塞读取最大/写道。即使你没有使用TPL,你也应该这样做以达到最高的效率,TPL使它更容易。
这里是你如何使用TPL来实现异步服务操作的“裸露的骨头”的例子:
public IAsyncResult BeginSomeLongRunningOperation(string sampleParam, AsyncCallback callback, object asyncState)
{
Task<int> processingTask = Task<int>.Factory.StartNew(
_ =>
{
... perform insanely long running operation here ...
return 42;
},
asyncState);
// If there was a callback, we have to invoke it after the processing finishes
if(callback != null)
{
processingTask.ContinueWith(
_ =>
{
callback(calculationTask);
},
TaskContinuationOptions.ExecuteSynchronously);
}
return processingTask;
}
public int EndSomeLongRunningOperation(IAsyncResult asyncResult)
{
return ((Task<int>)asyncResult).Result;
}
什么问题? – 2011-06-17 11:38:03