【发布时间】:2015-10-27 13:02:53
【问题描述】:
我有一个允许从网络服务器上传和下载信息的 REST WCF 服务。虽然这适用于非常基本的操作,例如向数据库提交信息(如状态更新),但当我们调用其他 Web 服务和 IO 资源(本质上是运行时间较长的任务)时,它就不太适用了。
Web 服务在执行其工作时让调用客户端保持挂起是不可接受的,例如,如果客户端已完成其数据发布并且我们在后台执行一些数字运算。
我最初的想法是,当客户端完成请求时,我们可以返回 HTTP 状态 202 / Accepted,并且客户端可以在完成后(通过其他方式)被回调。
暂时忽略在同一时间异步写入同一路径的各种 IO 问题,下面的代码将是在 IIS 中使用 WCF 服务的好方法。我担心在应用程序池回收的情况下,运行方法可能随时终止。
public class AsyncService : IAsyncService
{
public void WriteMessageToDisk(string value)
{
Thread.Sleep(120000); // Introduce some arbitrary sleep to keep the client waiting.
try
{
using (var writer = new StreamWriter(AppSettings.StorePath, true))
{
writer.WriteLine("{0} - {1}", DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"), value);
}
}
catch (IOException ex)
{
WriteMessageToDisk(ex.ToString());
}
}
public void WriteMessageToDiskAsync(string value)
{
var task = new Task(() => WriteMessageToDisk(String.Format("Message from Async runner: {0}", value)));
task.Start();
}
}
这是否是异步执行一些长时间运行工作的最佳方法?我也在考虑让另一个应用程序处理这些长时间运行的请求的可能性,这样它就不会与 IIS 混淆。
【问题讨论】:
-
我建议使用 Windows 服务或类似服务来运行这些任务。 IIS 将回收应用程序池。
-
我认为这是一个可能的选择。我真的不想在计划的服务器端代码之上添加另一个必须干预的服务,最好将其保留在一个位置而不是将其吐出。
标签: c# multithreading wcf rest iis