【发布时间】:2015-11-12 16:25:58
【问题描述】:
我对 C# WPF 还很陌生,并且一直在使用异步函数。这就是我所拥有的
private void btnGetAccount(object sender, RoutedEventArgs e) {
try {
var found = Task<bool>.Factory.StartNew(() => SearchForAccount());
await found;
}
catch ....
}
和
private bool SearchForAccount() {
Dispatcher.Invoke(() => { //UI Updates }
AnotherFunctionCall();
return true;
}
问题是,有时 SearchForAccount 函数会超时。我还没有弄清楚是什么原因造成的,因为没有抛出错误。我想实现一个允许取消此函数调用的按钮。我尝试过使用 CancellationTokenSource,但它似乎不像我这样做的那样工作。
任何帮助或建议将不胜感激。
谢谢! 现实转移
编辑:
这是我对 CancellationToken 的尝试
private void btnGetAccount(object sender, RoutedEventArgs e) {
CancellationTokenSource cts = new CancellationTokenSource();
try {
cts.CancelAfter(200);
var found = Task<bool>.Factory.StartNew(() => SearchForAccount(), cts.Token);
await found;
}
catch (OperationCanceledException ex) {
SetStatusLabel("Cancel done.");
}
}
我也尝试过这样的事情(不记得确切,现在不在撤消历史记录中):
private void btnGetAccount(object sender, RoutedEventArgs e) {
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
try {
cts.CancelAfter(200);
var found = Task<bool>.Factory.StartNew(() => SearchForAccount(token), cts.Token);
await found;
}
catch (OperationCanceledException ex) {
SetStatusLabel("Cancel done.");
}
}
我将令牌传递给函数,但我不记得我对函数做了什么。在这两种情况下,在 SearchForAccount 函数调用返回(如果它返回)之前,取消不会发生任何事情。如果它没有返回,那么它就被卡住了,这正是我想要一个取消按钮的原因。
快速运行: 程序启动。 用户可以输入用户名并点击搜索。 然后搜索将搜索该帐户是否存在于域中以及该帐户的一些详细信息。 搜索完成后,结果将发布到数据网格中。
问题: 当点击搜索时,有时(很少)它会无限期地继续搜索并且永远不会返回。返回超时消息的东西会很棒。
【问题讨论】:
-
请向我们展示您对
CancellationToken的尝试,并提供问题的最小编译重现 -
添加了一些包含更多信息的编辑。谢谢!
标签: c# wpf async-await cancel-button cancellationtokensource