【问题标题】:WCF REST Service - Do Work with System.Threading.Tasks.TaskWCF REST 服务 - 使用 System.Threading.Tasks.Task
【发布时间】: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


【解决方案1】:

您不会直接创建 Task 实例。

您使用工厂和辅助方法Task.Run

您还应该从异步方法返回Task 或Task(TResult)。

例如:

public Task WriteMessageToDiskAsync(string value)
{
    return Task.Run(() => WriteMessageToDisk(String.Format("Message from Async runner: {0}", value)));
}

【讨论】:

  • 这是否保证 IIS 不会对任务进行 bin 处理,或者它至少会等到任务有时间关闭后再退出应用程序池?
  • 不存在这样的保证...如果您使用的是 .NET 4.5.2,则可以查看 QueueBackgroundWorkItem 而不是 Task.Run。它将尝试将 AppPool 关闭延迟到所有任务完成后,
  • 我会看看这个以供将来参考。我目前仅限于 .NET Framework 4.5,因此在这种情况下它不会工作。谢谢。
猜你喜欢
  • 2010-09-21
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多