[C#.NET][TPL] 任務回傳結果通知

[C#.NET][TPL] Task Receive return Result

任務返回結果會需要用到以下:

通知任務步驟:

  1. 利用 Task.ContinueWith 方法,調用子任務。
  2. 使用 TaskContinuationOptions.OnlyOnRanToCompletion 列舉,做為子任務啟用條件。
  3. 調用 Task.Result 屬性,來取得結果

更多的內容請參考:

http://msdn.microsoft.com/zh-tw/library/dd537613.aspx

內文章節:

使用 Task<T> 類別:

調用 TaskFactory.StartNew 方法:

調用 Task.Run<T> 方法:


讓我們來看看實際的例子:

使用 Task<T> 類別:

1.使用Task<int>來啟動 mainTask 主任務 ,Task<int> 回傳了一個運算結果

2.在子任務裡使用 Task.Result 取得運結果


private void DoWork14() 
{ 
    var mainTask = new Task<int>(() => 
    { 
        int result = 0; 
        for (int i = 0; i < 100; i++) 
        { 
            result++; 
            SpinWait.SpinUntil(() => 
            { 
                m_SynchronizationContext.Post(_ => { this.label1.Text = result.ToString(); }, null); 
                return false; 
            }, 10); 
        } 
       return result; 
    }); 

    mainTask.ContinueWith(task => 
    { 
        var finish = string.Format("任務完成,完成狀態為:\rIsCanceled={0}\rIsCompleted={1}\rIsFaulted={2}\r", 
            task.IsCanceled, 
            task.IsCompleted, 
            task.IsFaulted); 
        var result = string.Format("計算結果:{0}", task.Result); 
        MessageBox.Show(finish + result); 
    }, TaskContinuationOptions.OnlyOnRanToCompletion); 
    mainTask.Start(); 
} 

調用 TaskFactory.StartNew 方法:

寫法跟上個例子一樣,只是把 Task<int> 換成 Task.Factory.StartNew,CLR 自動幫你轉成 Task<int>,在使用上就不需要宣告回傳型別,用起來確實很方便。


private void DoWork15()
{
    var mainTask = Task.Factory.StartNew(() =>
    {
        int result = 0;
        for (int i = 0; i < 100; i++)
        {
            result++;
            SpinWait.SpinUntil(() =>
            {
                m_SynchronizationContext.Post(_ => { this.label1.Text = result.ToString(); }, null);
                return false;
            }, 10);
        }
        return result;
    });

    mainTask.ContinueWith(task =>
    {
        var finish = string.Format("任務完成,完成狀態為:\rIsCanceled={0}\rIsCompleted={1}\rIsFaulted={2}\r",
            task.IsCanceled,
            task.IsCompleted,
            task.IsFaulted);
        var result = string.Format("計算結果:{0}", task.Result);
        MessageBox.Show(finish + result);
    }, TaskContinuationOptions.OnlyOnRanToCompletion);
}

調用 Task.Run<T> 方法:

Task.Run<int> 是.NET 4.5的產物,用法就跟 Task<int> 一樣,只是不需要另外調用 Start 方法


private void DoWork16()
{
    var mainTask = Task.Run<int>(() =>
    {
        int result = 0;
        for (int i = 0; i < 100; i++)
        {
            result++;
            SpinWait.SpinUntil(() =>
            {
                m_SynchronizationContext.Post(_ => { this.label1.Text = result.ToString(); }, null);
                return false;
            }, 10);
        }
        return result;
    });

    mainTask.ContinueWith(task =>
    {
        var finish = string.Format("任務完成,完成狀態為:\rIsCanceled={0}\rIsCompleted={1}\rIsFaulted={2}\r",
            task.IsCanceled,
            task.IsCompleted,
            task.IsFaulted);
        var result = string.Format("計算結果:{0}", task.Result);
        MessageBox.Show(finish + result);
    }, TaskContinuationOptions.OnlyOnRanToCompletion);
}

 

如下圖,以上三個方法執行結果都相同

 

SNAGHTML3b8fa20b

 

 

以上文章出自:http://www.dotblogs.com.tw/yc421206/archive/2013/06/11/105442.aspx

 

 

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo