[英]AsyncEnumerator not waiting for task
我正在嘗試使用https://www.nuget.org/packages/AsyncEnumerator/ 中的 AsyncEnumerator
所以我編寫的方法與他們的示例完全相同,但是,我的任務不是在應該在哪里等待而是退出程序。
我調用了 async fillData_async,它里面有一個並行循環,它運行我的長任務並且應該等待。
private void Form1_Load(object sender, EventArgs e)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
ConcurrentBag<phoneData> Concurrent_PhoneNoList = new ConcurrentBag<phoneData>();
using (SqlCommand cmd = new SqlCommand("Select * FROM numbers", conn))
{
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
phoneData temp = new phoneData();
int phoneno = 0;
if (int.TryParse(reader["number"].ToString(), out phoneno) == true)
{
temp.phoneID = (int.Parse(reader["id"].ToString()));
temp.phoneNo = phoneno;
}
Concurrent_PhoneNoList.Add(temp);
}
conn.Close();
}
string log += fillData_Async(Concurrent_PhoneNoList); // calls async here
stopwatch.Stop(); // instantly continues without waiting
TimeSpan ts = stopwatch.Elapsed;
string.Format("{0}:{1}", Math.Floor(ts.TotalMinutes), ts.ToString("ss\\.ff"));
log += "TotalTime: " + ts;
Application.Exit();
}
我的異步方法:
private async Task<string> fillData_Async(ConcurrentBag<phoneData> phoneNolist)
{
string log = "Total Lines Retrieved From Database : " + phoneNolist.Count + "<br/>";
int failures = 0;
await phoneNolist.ParallelForEachAsync(async item =>
{
string returned_Data = await callWebServiceTask(item.phoneNo);
if (returned_Data != "Failed")
{
item.Data = returned_Data;
}
else
{
//failedList1.Add(temp);
failures++;
}
}, maxDegreeOfParalellism: 20);
log += "Number of failures : " + failures;
return log;
}
private Task<string> callWebServiceTask(int phoneNo)
{
string datareturned = myverylongtask(phoneNo); // public static string
return Task.FromResult(datareturned);
}
您不是在等待FillData_Async
完成。 添加.Result
到最后,或者await
它
// note: if you wait on a task like this from inside an async method,
// deadlocks might happen.
string log += fillData_Async(Concurrent_PhoneNoList).Result;
或者
string log += await fillData_Async(Concurrent_PhoneNoList);
如果您選擇await
, 方法,則必須使調用方法Async
。
// async void should *only* be used for event handlers
private async void Form1_Load(object sender, EventArgs e)
{
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.