簡體   English   中英

多個異步任務執行

[英]Multiple Asynchronous Task execution

請多多包涵 :-)

我正在努力解決c#中的TPL問題,並試圖找出設計解決方案的最佳方法,以啟動多個異步任務,等待它們完成並繼續前進。 我最初的POC在下面。 每個IDataGatherer實例都需要獲取數據並將其按摩到DataObject實例中。

  1. 我不確定如何處理DownloadStringTaskAsync調用的延續,這樣我就可以獲取結果並將其按下到DataObject中。 ContinueWith希望提供一個帶有void返回簽名的方法,但我覺得ExtractData方法需要返回一個Task實例,否則我沒有從GetDataAsync()方法返回的Task實例。

  2. 我也想知道是否需要在我的IDataGatherer實例中引入TaskCompletionSource,但是如何將其與正在進行實際工作的任務相關聯 - 例如,DownloadstringTaskAsync和ExtractData?

interface IDataGatherer
{
    Task<DataObject> GetDataAsync();
}

class DataObject
{
    public string Data { get; set; }
}

class IpGatherer : IDataGatherer
{
    private readonly string _url = "http://ip.jsontest.com";

    public Task<DataObject> GetDataAsync()
    {
        var tcs = new TaskCompletionSource<DataObject>(); // Do I need this???

        var client = new WebClient();

        // stuck here
        var task = client.DownloadStringTaskAsync(_url).ContinueWith(ExtractData);
    }

    private void ExtractData(Task<string> obj)
    {

    }
}

class Program
{
    private static void Main(string[] args)
    {
        // takes a list of IDataGatherers and waits for them
        // all to complete, handles exceptions, etc.
    }
}

以這種方式設計解決方案可能會使事情變得過於復雜,因此我願意提出清理建議或更簡潔地完成任務的建議。

我正在使用.NET 4.5

首先,您不需要TaskCompletionSource 這是因為可以ContinueWith()提供具有非void簽名的方法。 例如:

public Task<DataObject> GetDataAsync()
{
    var client = new WebClient();

    return client.DownloadStringTaskAsync(_url)
                 .ContinueWith((Func<Task<string>, DataObject>)ExtractData);
}

private DataObject ExtractData(Task<string> task)
{
    return new DataObject(task.Result);
}

(使用Result不會阻止,因為您可以確定此時將完成Task 。)

但是,由於您使用的是DownloadStringTaskAsync() ,因此您可能使用.Net 4.5,這意味着您可以使用await 這使代碼更簡單:

public async Task<DataObject> GetDataAsync()
{
    var client = new WebClient();

    var s = await client.DownloadStringTaskAsync(_url);
    return ExtractData(s);
}

private DataObject ExtractData(string s)
{
    return new DataObject(s);
}

暫無
暫無

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

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