簡體   English   中英

運行多個C#任務異步

[英]Running multiple C# Task Async

嗨,通常我會用背景工作者這樣做,但我想用C#Task來做,只是為了更好地理解Task。

問題是我有一個具有以下屬性的類

    private int _number1;
    public int Number1
    {
        get { return _number1; }
        set { _number1 = value; OnPropertyChanged("Number1");}
    }

    private int _number2;
    public int Number2
    {
        get { return _number2; }
        set { _number2 = value; OnPropertyChanged("Number2");}
    }

請注意我使用INotifyPropertyChanged。

Number1 = Task<int>.Factory.StartNew(() => GenerateResult()).Result;
Number2 = Task<int>.Factory.StartNew(() => GenerateResult2()).Result;

GenerateResult和GenerateResult2只是dumme方法,他們睡覺然后返回一個數字。

我如何使這項工作異步? 從現在開始,GenerateResult2()首先在GenerateResult()完成時調用。

我需要它能夠工作異步,因為我不知道每個任務何時完成,或者即使它將完成。

獲得Result屬性后,您實際上正在等待任務完成。 它將在后台線程上執行,但是在啟動下一個線程之前,您正在主線程中等待完成。

有關詳細信息,請參閱MSDN文檔

您應該能夠從后台線程中分配屬性:

Task<int>.Factory.StartNew(() => Number1 = GenerateResult());

WPF數據綁定將負責將PropertyChanged事件編組到正確的調度程序線程。

我檢查了這個: 任務並行(任務並行庫)並且它指出當使用System.Threading.Tasks.Task<TResult> ,任務以異步方式運行並且可以以任何順序完成。 如果在計算完成之前訪問Result,則該屬性將阻塞該線程,直到該值可用。

我認為這意味着如果您在訪問.Result之前有一個值,就像您在示例代碼中所做的那樣,您將不得不等待它先完成。

它確實有意義,因為在完成任務之前不會填充Result屬性。

Task<int>.Factory.StartNew(() => GenerateResult2()).ContinueWith(() => GenerateResult());

暫無
暫無

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

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