繁体   English   中英

.NET 客户端 WCF 带队列任务

[英].NET Client-Side WCF w/Queued Tasks

在现代化过程中,我正在尝试更新旧库以使用客户端 WCF 服务。 以下内容接近我需要的内容,但我不知道如何将创建的任务添加到一次只处理一个请求的队列中。

[ServiceContract(Name="MyService", SessionMode=Session.Required]
public interface IMyServiceContract
{
    [OperationContract()]
    Task<string> ExecuteRequestAsync(Action action);
}

public class MyService: IMyServiceContract
{
    // How do I get this piece in a task queue?
    public async Task<string> ExecuteRequestAsync(Request request)
    {
        return await Task.Factory.StartNew(() => request.Execute();)
    }
}

我查看了 Servy 共享的 TaskQueue( .NET 中管理单独(单)线程上任务队列的最佳方式)。 但是,我无法将两者结合成有效的东西。 当我尝试将我的任务添加到下面的 TaskQueue 时,该任务永远不会运行。 我知道我错过了一些东西,所以非常感谢任何帮助。

public class TaskQueue
{
    private SemaphoreSlim semaphore;
public TaskQueue()
    {
        semaphore = new SemaphoreSlim(1);
    }

    public async Task<T> Enqueue<T>(Func<Task<T>> taskGenerator)
    {
        await semaphore.WaitAsync();
        try
        {
            return await taskGenerator();
        }
        finally
        {
            semaphore.Release();
        }
    }
    public async Task Enqueue(Func<Task> taskGenerator)
    {
        await semaphore.WaitAsync();
        try
        {
            await taskGenerator();
        }
        finally
        {
            semaphore.Release();
        }
    }
}

谢谢

我最终添加到任务队列:

Task<T> Enqueue<T>(Func<T> function)
{
    await semaphore.WaitAsync();
    try
    {
        return await Task.Factory.StartNew(() => function.invoke();)
    }
    finally
    {
        semaphore.Release();
    }
}

并且,将主机更新为以下内容:

return await queue.Enqueue(request.Execute();)

而且,这正是我需要 WCF 服务所需要的。 这些项目从多个发送请求的应用程序中执行 FIFO。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM