如何知道任务何时完成?

时间:2014-01-03 04:49:40

标签: wpf task-parallel-library

我想做这样的事情:

Loading = true;
var data = await DataProvider.DoWorkAsync();
Loading = false; // but have this not get set until the data is loaded

加载只是绑定到WPF应用程序中的进度指示器的属性,并且会注入DataProvider。我只想知道数据何时完成加载,以便我可以更新进度指示器。

编辑: 已将DoWork()更新为DoWorkAsync(),因为它在我的代码中。 DoWorkAsync()DoWork()调用看起来像这样

public Task<DataStructure> DoWorkAsync() 
{
    return Task.Run(() => DoWork());
}

public DataStructure DoWork() 
{
    var dataStructure = new DataStructure();
    // Heavy lifting here
    return dataStructure;
}

上面的代码不起作用,因为我实际上并没有用await返回任务,所以我不确定ContinueWith()是否是正确的方法。

最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

似乎应该可以正常工作。

尝试在代码隐藏中创建一个仅包含以下代码的新WPF应用程序:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        Loading = true;
        var data = await DoWorkAsync();
        txt.Text = data.Name;
        Loading = false;
    }

    public Task<DataStructure> DoWorkAsync()
    {
        return Task.Run(() => DoWork());
    }

    public DataStructure DoWork()
    {
        var dataStructure = new DataStructure();
        System.Threading.Thread.Sleep(5000);
        dataStructure.Name = "Test";
        return dataStructure;
    }

    public class DataStructure
    {
        public string Name { get; set; }
    }


    private bool _loading = false;
    public bool Loading
    {
        get { return _loading; }
        set
        {
            _loading = value;

            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Loading"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

}

..和一个类似这样的XAML文件:

<StackPanel>
    <ProgressBar IsIndeterminate="{Binding Loading}" Height="50" Width="100" />
    <Button Content="Test" Click="Button_Click" />
    <TextBlock x:Name="txt" />
</StackPanel>

您应该看到按钮事件处理程序将异步调用DoWorkAsync方法并启动进度条。 Task完成后,TextBlock将更新,进度条将停止。

也许你可以用这个例子来弄清楚你做的不同了什么?