gpt4 book ai didi

c# - 使用 Web 服务的并行(异步)任务以避免线程

转载 作者:行者123 更新时间:2023-12-03 21:52:00 24 4
gpt4 key购买 nike

我有一个并行执行的任务;例如,异步打印用户选择的文档。一种方法可能是使用工作线程。但想想这样的场景:成千上万的请求涌入 Web 服务器,并且应用程序又产生一个线程用于打印,这听起来很可怕。如果所有并发用户都开始打印怎么办?

这就是我想避免工作线程的原因。

为了解决这个问题,我已将代码移至 Web 服务中;我正在调用 PrintAsync() 方法,并且我已订阅 OnPrintComplete 以获得通知。现在我可以发送任意数量的打印件,而不必担心 ASP.NET 线程匮乏或阻塞请求。

我知道 Web 服务内部使用线程,但那是 IOCP 线程,这意味着它不会打扰 asp.net 工作线程。

我想不出可能的缺点,除了它将是一项网络服务。

这是一个好方法吗?处理此功能的 更好 替代版本是什么?

最佳答案

所以你已经描述了如何在客户端上进行异步调用,实际上我还想问一些关于你如何在那里完全异步的问题,但似乎你的问题更多的是关于如何服务端尽可能高效,对吗?

如果您在服务操作中执行长时间运行或 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;
}

关于c# - 使用 Web 服务的并行(异步)任务以避免线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6385165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com