【发布时间】:2015-09-16 17:35:40
【问题描述】:
我有一个函数,它获取 Func 作为参数并在异步方法中的任务内部执行它,以便在函数工作时显示不确定的进度条......
private async void Invoke(Func<string> function)
{
if(calculation?.Status == TaskStatus.Running) await calculation;
calculation = Task.Run(function);
InvokeA(() => prg.Height = double.NaN);
InvokeA(() => prg.Visibility = Visibility.Visible);
Result = await calculation;
InvokeA(() => prg.Visibility = Visibility.Hidden);
InvokeA(() => prg.Height = 0);
}
问题是函数何时到达:
Result = await Calculation;
它有点停止......它永远不会真正设置值或关闭进度条。
如果键为 Enter,则从 Textbox.KeyDown 方法调用 Invoke:
if (SpecialCommands.DoesExist(Text))
{
Invoke(() => SpecialCommands.Invoke(Parameter));
if (!string.IsNullOrEmpty(Result)) Text += $" ---> {Result}";
}
变量定义:
calculation = Task<string>
Result = string
prg = ProgressBar
Parameter = string that isn't connected to the UI
【问题讨论】:
-
搜索“async Task.Run on GUI thread”你会找到死锁的原因。
-
calculation设置在哪里,它的类型是什么?通常,您会使用await关键字以及async方法的实际调用。 -
请提供演示问题的示例代码,而不是感谢信(已删除)。您到目前为止显示的代码应该可以工作。还要确保在“它刚刚停止”时显示一堆有趣的阅读,并在更新帖子时查看有关“C# async Wait deadlock”的类似帖子。
-
旁注:当您谈论程序时,“crash”和“stops”通常是不同的东西。 “停止”的同义词是“冻结”; “崩溃”通常意味着异常/终止。
-
@JamesWright 计算是一个任务
,结果是一个字符串
标签: c# wpf asynchronous task