gpt4 book ai didi

c# - 在 WPF 应用程序中使用等待

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:12 25 4
gpt4 key购买 nike

我正在尝试在 C# 中执行异步函数。我能够使用此代码获得它:

private async Task loadData()
{
try
{
await Task.Run(() => { testTableAdapter.Fill(testDataSet.tbl); });
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

但由于我正在尝试访问 UI 控件,所以我尝试在不执行 Task.Run 的情况下执行此操作(因此我不会启动新的工作线程),但我收到了一个我不理解的错误或怎么修。

private async Task loadData()
{
try
{
await testTableAdapter.Fill(testDataSet.tbl);
perComboBox.text = loadedSearch.toString();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

错误是:

Severity Code Description Project File Line Error CS1061 'int' does not contain a definition for 'GetAwaiter' and no extension method 'GetAwaiter' accepting a first argument of type 'int' could be found (are you missing a using directive or an assembly reference?)

最佳答案

这是您的解决方案。请阅读 Stephen Cleary 主页提供的更多内容。使用异步时,Thread 和 Background Worker 已过时。根据您使用 LoadData 的位置,提供同步方法始终是个好主意。然后,您可以根据实现将其包装成异步的。您真的应该从适当的 DataAccessLayer 取回您的 TableAdaper 结果。记住关注点分离。

将您的方法更改为:

private int LoadData()
{
try
{
return testTableAdapter.Fill(testDataSet.tbl);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}

return -1;
}

现在是调用类中的异步包装器。实际上,异步部分应该在窗口加载或其他 GUI 事件中。这是将填充您的数据的按钮单击示例。 .ConfigureAwait(false) 表示等待程序将被发送到调度程序而不是在 GUI 线程上执行。还可以考虑将 MVVM 用于 WPF。我想指出,如果调用 Window_Closing 事件,_cToken 的 CancellationTokenSource 将设置为 Cancel()。这是为了确保您的异步操作得到清理。

private async void _btnTruck_OnClick(object sender, RoutedEventArgs e)
{
int count = 0;

try
{
count = await Task.Run(() => LoadData(), _cToken).ConfigureAwait(false);
perComboBox.text = loadedSearch.toString();
}
catch (Exception ex)
{
_log.Error(ex);
}
}

关于c# - 在 WPF 应用程序中使用等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33414634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com