【问题标题】:.NET Client-Side WCF w/Queued Tasks.NET 客户端 WCF 带队列任务
【发布时间】:2022-08-19 09:39:16
【问题描述】:

在现代化过程中,我试图更新遗留库以使用客户端 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(Best way in .NET to manage queue of tasks on a separate (single) thread)。但是,我在将两者结合成有效的东西时遇到了麻烦。当我尝试将我的任务添加到下面的 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();
        }
    }
}

谢谢

  • 有日志信息吗?如果可能,打印出日志以查看报告了哪些错误。

标签: c# .net wcf queue task


【解决方案1】:

我最终添加到任务队列:

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。

【讨论】:

    猜你喜欢
    • 2014-03-18
    • 2010-12-22
    • 1970-01-01
    • 2022-08-19
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2017-02-12
    相关资源
    最近更新 更多