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

本文关键字:Threading Tasks Task System 使用 REST 服务 WCF | 更新日期: 2023-09-27 18:19:30

我有一个REST WCF服务,它允许从Web服务器上传和下载信息。虽然这适用于非常基本的操作,如向数据库提交信息,如状态更新,但当我们调用其他web服务和IO资源时,它就不太适用了,因为它们本质上是运行时间较长的任务。

web服务在执行工作时让调用客户端挂起是不可接受的,例如,如果客户端已经完成了数据发布,而我们在后台要执行一些数字运算。

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

暂时忽略在同一时间写入同一路径时的各种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混淆。

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

您不直接创建Task实例。

相反,您使用工厂和助手方法Task。运行

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

例如:

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