我想做这样的事情:
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()
是否是正确的方法。
最好的方法是什么?
答案 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
将更新,进度条将停止。
也许你可以用这个例子来弄清楚你做的不同了什么?