簡體   English   中英

AsyncEnumerator 不等待任務

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM