【发布时间】:2019-01-28 19:34:06
【问题描述】:
我已经检查了一些主题和谷歌,但找不到合适的解决方案。 我想让 WPF 应用程序使用 RestApi 使用 TextBox(项目名称)将项目信息下载到 DataGrid(项目列)。
代码正确且有效,但异步更新 DataGrid 存在问题。
DataTable dt;
public DataTable Dt { get => dt; set { dt = value; dataGridItems.DataContext = Dt.DefaultView; } }
private async void ButtonSearch_Click(object sender, RoutedEventArgs e)
{
//buttonSearch.IsEnabled = false;
rest = new RestClass(ClientId, ClientSecret);
Task T = Task.Run(() => SearchItem(rest, textBoxProductName.Text));
T.ContinueWith((t) =>
{
dataGridItems.DataContext = Dt.DefaultView;
//buttonSearch.IsEnabled = true;
}, TaskScheduler.FromCurrentSynchronizationContext());
上面有小改动的代码 (dataGridItems.DataBinding) 在 WinForms 中运行没有任何问题,但我无法让它在 WPF 应用程序中运行。
private void SearchItem(RestClass Rest, string ItemName)
{
try
{
var x = Rest.GetTokenJ().Result;
ItemsOffersWPF.Rootobject searchResponse = Rest.requestSearchItem(ItemName);
GetItemsCollection(searchResponse);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//dataGridItems.DataContext = Dt.DefaultView;
}
我尝试过 Invoke、InvokeAsync,但它使 UI 不负责任,这是我想要避免的。
【问题讨论】:
-
猜猜,那个 SearchItem() 方法会冻结你的 UI。您所要做的就是在后台任务中调用它。当它准备好时,即在代码中的 ContinueWith 中 - 调用 Dispatcher.Invoke() 并进行您想要做的更改。如果要更新 Control,请确保您获得的 Dispatcher 实例。
-
另一种猜测:您的
ButtonSearch_Click包含async关键字,因此您可能在Task.Run(() =>...);之前缺少await -
在 Task.Run 之前尝试等待,但它给出了 UI 正在从另一个线程更新的错误
标签: c# wpf asynchronous async-await wpfdatagrid