如何解决异步调用 WCF 服务并在新任务中等待它
我是基于任务的编程的新手。我必须异步调用 WCF 服务并启动一个任务来等待它,因为我不想在相同的方法中等待,所以我编写了这样的代码
void MyMainMethod()
{
for(int j=0;j<10; j++)
{
int I = 100;
Task<response> res = _client.GetValueAsnc(request);
//Do some work
Task.Run(()=> WaitForResponse(res,I));
}
}
Async Task WaitForResponse(Task<response> res,int I)
{
await res;
if(res.responsecode == "Success")
{
//udatateDB...
}
else
{
//update DB with Error Message..
}
}
这样,如果我在循环中调用此服务 10 次,它将启动 10 个任务并给我响应,而不是在 MyMainMethod() 中等待响应,我为每个请求启动一个单独的任务。
请让我知道这是否是正确的方法,或者我在这里犯了一些重大错误,如果需要我方提供更多详细信息来解释问题。
提前致谢。
解决方法
您尝试实现的目标是一件好事。不阻塞一些主线程是个好主意,你这样做的方式会奏效。
但是,如果这样做,则必须手动控制任务数量。您可能不希望该数字过高,否则过多的并行性可能会影响性能。
.net 中有一些类可以通过所谓的线程池来帮助管理任务队列。 您使用已知的最大线程数配置线程池,然后将任务排队到池中。线程池类负责清空队列并将任务分配给池中的空闲线程。
您可以了解有关线程池的更多信息 here on ms docs
以下示例来自 MS 文档站点。
using System;
using System.Threading;
public class Example
{
public static void Main()
{
// Queue the task.
ThreadPool.QueueUserWorkItem(ThreadProc);
Console.WriteLine("Main thread does some work,then sleeps.");
Thread.Sleep(1000);
Console.WriteLine("Main thread exits.");
}
// This thread procedure performs the task.
static void ThreadProc(Object stateInfo)
{
// No state object was passed to QueueUserWorkItem,so stateInfo is null.
Console.WriteLine("Hello from the thread pool.");
}
}
// The example displays output like the following:
// Main thread does some work,then sleeps.
// Hello from the thread pool.
// Main thread exits.
,
为什么不在线程池上使用任务并行库。
class Client
{
internal async Task<string> GetValueAsnc()
{
Console.WriteLine("GetValueAsync");
await Task.Delay(TimeSpan.FromSeconds(2));
return "success";
}
}
class Program
{
private static readonly Client _client = new Client();
static void Main(string[] args)
{
var tasks = new List<Task>();
for (int j = 0; j < 10; j++)
{
tasks.Add(WaitForResponse());
}
Task.WhenAll(tasks);
Console.WriteLine("Tasks finished");
Console.ReadLine();
}
static async Task WaitForResponse()
{
var res = await _client.GetValueAsnc();
if (res == "Success")
{
//udatateDB...
}
else
{
//update DB with Error Message..
}
}
}
拥有比ThreadPool更好的api,这样就不用担心线程饥饿
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。