[英].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.