繁体   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