簡體   English   中英

在異步任務中捕獲異常

[英]Catch exception in async Task

我正在使用C#(控制台應用程序)。

在我的程序中,我必須聯系httpClient。 首先,我檢查客戶端是否使用GetAsync響應。 所以我的請求方法是異步的,使我的任務異步。

當客戶端不響應(或其他)時,它將引發異常,但我無法捕獲它。

我添加了一個ContinueWith但是不起作用。 有了breackpoint,我看到了在我的Task開始時到達了這段代碼,因此異常始終為null。

我怎么解決這個問題 ?

有我的代碼:

static void Run()
{
    String urlRequest = "";
    CancellationTokenSource cts = new CancellationTokenSource();
    CancellationToken ct = cts.Token;

    Console.WriteLine($"Program running, press a key to stop");
    try
    {
        Task task = Task.Factory.StartNew(async () =>
        {
            using (HttpClientHandler handler = new HttpClientHandler { Credentials = new NetworkCredential("user", "pass") })
            {
                HttpClient client = new HttpClient(handler);
                client.BaseAddress = new Uri(urlRequest);
                client.DefaultRequestHeaders.Accept.Clear();
                bool serviceAvailable = await CheckService(client);
                if (serviceAvailable)
                {
                    bool doLoop = true;
                    while (doLoop)
                    {
                        // Do something

                        Thread.Sleep(100);
                        if (ct.IsCancellationRequested)
                        {
                            Console.WriteLine("\r\ntask cancelled");
                            break;
                        }
                    }
                }
                else
                {
                    throw new HttpRequestException($"Unable to contact service at {urlRequest}");
                }
            }

        }, ct).ContinueWith(tsk =>
        {
            if (tsk.Exception != null)
                throw tsk.Exception;
        });

        Console.ReadKey();
        cts.Cancel();
        Thread.Sleep(1000);
    }
    catch (Exception e)
    {
        Log(e);
    }
}

static async Task<bool> CheckClient(HttpClient client)
{
    Console.WriteLine("Check service Call ...");
    HttpResponseMessage response = await client.GetAsync("CheckService");
    if (response.IsSuccessStatusCode)
    {
        return true;
    }

    return false;
}

您既不等待也不觀察任務的結果。 假設您是針對.Net 4.5或更高版本運行此程序,則存在該異常,但它並未引起注意。

因此,首先,您應該.Wait()完成任務,以便調用代碼有機會觀察異常。

一般來說,您應該避免使用Task.Factory.StartNew()而應首選Task.Run() -請參閱Stephen Toub的why解釋 但是,如果出於某種原因更喜歡使用Task.Factory.StartNew ,則還必須首先.Unwrap()原始任務,以獲得想要獲得結果的實際任務。 (請注意, .Unrwap()是可用於Task<Task>而不是Task的擴展方法,因此請相應地鍵入原始變量;即,使用var task = Task.Factory.StartNew(...)

無論任務成功與否,都將在任務完成時執行ContinueWith

成功的情況下,ContinueWith中的tsk.Exception將為null。

你能試一下嗎 :

.StartNew(...)
.ContinueWith(tsk =>
        {
            //thrown
        },TaskContinuationOptions.OnlyOnFaulted);

暫無
暫無

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

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