【发布时间】:2018-11-29 15:34:16
【问题描述】:
我有一个 asp.net 控制台应用程序,在这个控制台应用程序中,我想使用 WhenAll 以并行方式调用异步方法,这是我的控制台应用程序主方法:
static void Main(string[] args)
{
Marketing ipfd = new Marketing();
try
{
using (WebClient wc = new WebClient()) // call the PM API to get the account id
{
//code goes here...
}
}
catch (Exception e)
{
}
var tasks = ipfd.companies.Select(c => gettingCustomerInfo(c.properties.website.value)).ToList();
var results = await Task.WhenAll(tasks);}
}
这是我正在调用的方法:-
class Program
{
static int concurrentrequests = int.Parse(ConfigurationManager.AppSettings["ConcurrentRequests"]);
SemaphoreSlim throttler = new SemaphoreSlim(initialCount: concurrentrequests);
int numberofrequests = int.Parse(ConfigurationManager.AppSettings["numberofrequests"].ToString());
int waitduration = int.Parse(ConfigurationManager.AppSettings["waitdurationmilsc"].ToString());
private async Task<ScanInfo> gettingCustomerInfo(string website)
{
await throttler.WaitAsync();
ScanInfo si = new ScanInfo();
var tasks = ipfd.companies.Select(c => gettingCustomerInfo(c.properties.website.value)).ToList();
var results = await Task.WhenAll(tasks);
但我得到了这些例外:-
“await”运算符只能在异步方法中使用。考虑 用 'async' 修饰符标记这个方法并改变它的返回值 键入“任务”
非静态字段、方法或 属性 '***.Program.gettingCustomerInfo(string)'
那么任何人都可以就此提出建议吗?现在我知道第一个异常是关于 Main 方法本身不是异步的,但是如果我将 main 方法定义为异步,那么我会得到另一个异常,即程序不包含可以作为端点调用的 Main 方法?
【问题讨论】:
-
你试过 Task mainTask = Task.WhenAll(tasks).Wait() 吗?
-
@LeBigCat 现在如果我定义以下
var results = Task.WhenAll(tasks).Wait();我会得到这个错误Cannot assign void to an implicitly-typed local variable *****\Program.cs+ 我仍然会得到我上面的第二个错误.. -
是的,如果您的任务不返回 void,您还必须将类型添加到 mainTask(这是下面的第一个答案;))
-
@LeBigCat 不确定你到底是什么意思?
-
Task
或 var mainTask = Task.WhenAll(tasks).Wait() 也可以,你也可以使用 Task.WaitAll(tasks.ToArray())
标签: c# asp.net async-await task