簡體   English   中英

如何測試以確保此代碼確實在異步運行?

[英]How can I test to make sure this code is really running async?

我修改了以下代碼,以嘗試通過Wasson的asp.net代碼從Web api加載。

static public async Task<IEnumerable<T>> ExecuteAsync(HttpClient client, String endPoint)
    {
        IEnumerable<T> result = null;
        HttpResponseMessage response =  client.GetAsync(endPoint).Result;
        response.EnsureSuccessStatusCode();
        if (response.IsSuccessStatusCode)
        {
            var tResult = await response.Content.ReadAsStringAsync();
            result = JsonConvert.DeserializeObject<IEnumerable<T>>(tResult);
        }
        return result;
    }

按照我的設計,我認為該過程將異步運行,但是我不確定如何對其進行測試以確保能夠正常運行。

我是異步編碼的新手,所以任何建議都將對您有所幫助。

調用過程如下:

public virtual IEnumerable<T> Fill()
    {
        IEnumerable<T> result = null;
        try
        {
            using (var client = CreateClient("", new MediaTypeWithQualityHeaderValue("application/json")))
            {

                String _endPoint = "api/" + typeof(T).Name + "/Get";

                result = (ExecuteAsync(client, _endPoint)).Result;
            }
        }
        catch (Exception ex)
        {
            LogError(ex.Message);

        }
        return result;
    }

這種組合是否可能按照我的意願異步運行?

我希望能夠異步運行它的原因是Fill例程從數據庫中獲取大量數據。 盡管某些記錄的大小也可能是一個問題,但更可能是大量單個記錄而不是每個記錄都很大。

我不希望的是坐在那里的用戶在與數據庫進行通信時等待整個頁面加載。

在這種情況下,我是直接連接到數據庫還是通過正在使用的Web API並不重要:在某些情況下,這兩種方法都需要花費很長時間。

我還擔心僵局:一個大的獲取進入而另一個未決。

我最初按照Mike Wasson的示例代碼對代碼進行了模式化,但是發現即使編譯后該代碼也會無限期地掛起。

這有助於使情況更好嗎?

不知道你在這里想要的伴侶。 您發布的代碼仍將阻塞它所在的線程,因為您正在調用將阻塞的結果。

result = (ExecuteAsync(client, _endPoint)).Result;

您可以通過讓async和await關鍵字傳播回最初創建請求的任何方法來使其異步。

public virtual async Task<IEnumerable<T>> Fill()
{
    ...
    result = await ExecuteAsync(client, _endPoint);
    ...
}

但是,我不確定這是您真正想得到的,因為您提到了

我不希望的是坐在那里的用戶在與數據庫進行通信時等待整個頁面加載。

默認情況下,使事情異步不會為您解決這個問題。 一項操作需要15秒才能完成,無論同步還是異步,都需要15秒才能完成。 不同之處在於,如果它是異步的,那么您將更加節省資源(這意味着,您可以在等待某些事情完成的同時釋放線程以執行其他職責)。

但是,您可以使用任務來實現並行性。 舉個例子:

public void DoWork()
{
    Thread.Sleep(10000);
}

public void DoMoreWork()
{
    Thread.Sleep(10000);
}

如果我們這樣稱呼這兩個

DoWork();
DoMoreWork();

那將花費20000 ms或20秒,如果我們使它異步

public async Task DoWork()
{
    await Task.Delay(10000);
}

public async Task DoMoreWork()
{
    await Task.Delay(10000);
}

並這樣稱呼它

await DoWork();
await DoMoreWork();

然后,仍然需要20秒才能完成。 但是,由於DoWork和DoMoreWork可以彼此獨立運行,因此我們可以同時運行兩者

await Task.WhenAll(DoWork(), DoMoreWork());

(在理想情況下)這將導致兩個任務在10秒內完成,從而使用戶必須等待的時間減半。

希望我對這個問題有所了解:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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