WCF REST服务 - 使用System.Threading.Tasks.Task

时间:2015-10-27 13:02:53

标签: c# multithreading wcf rest iis

我有一个REST WCF服务,允许从网络服务器上传和下载信息。虽然这适用于非常基本的操作,例如向数据库提交信息(例如状态更新),但当我们调用其他Web服务和IO资源时,它们的工作效果不佳,这些资源本质上是运行较长的任务。

如果客户端已完成其数据发布并且我们在后台执行了一些数字运算,那么Web服务在调用客户端工作时保持挂起是不可接受的。

我的初步想法是,当客户端完成请求后,我们可以返回HTTP状态202 / Accepted,并且客户端可以在完成后回调(通过其他方式)。

暂时忽略这里同时写入同一路径的各种IO问题Async下面的代码是在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。

1 个答案:

答案 0 :(得分:0)

您不直接创建Task个实例。

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

您还应该从异步方法返回TaskTask(TResult)

例如:

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