【发布时间】:2026-01-03 03:15:02
【问题描述】:
await Task.Run(() =>
{
if (tempFormulaFibonacci.Contains($"+ ({multiplicatorsSlider.Value}*numberPosition)"))
{
finalFormula = tempFormulaFibonacci.Replace($"+ ({multiplicatorsSlider.Value}*numberPosition)", $"+ {multiplicatorsSlider.Value}*" + Convert.ToString(++temp));
tempFormulaFibonacci = Convert.ToString(finalFormula);
}
if (tempFormulaFibonacci.Contains("numberPosition"))
{
finalFormula = tempFormulaFibonacci.Replace("numberPosition", Convert.ToString(Array.IndexOf(Sequence, Sequence[Convert.ToInt32(addPrevSlider.Value)]) - 1));
}
});
我决定在我的一个程序中自动创建公式。您在上面看到的这段代码旨在在公式中找到“numberPosition”并将其替换为一些数字(不要太注意变量的名称,因为它们在这个问题的上下文中并不特别重要)。
我在使用此代码时遇到的主要问题是它无法正常工作。如果我删除了一个if 语句以及其中的所有内容,则代码将正常工作一半。如果我将两个 if 语句与其中的所有内容一起保留,则代码将无法正常工作,因此我决定使用 async 和 await 来解决问题(也许问题就在那里,我想可能Replace 方法需要一点时间)。但是,当我尝试运行您在上面看到的代码时,我开始收到InvalidOperationException“调用线程无法访问此对象,因为不同的线程拥有它”。我从The calling thread cannot access this object because a different thread owns it 找到了这个解决方案,但是:
this.Dispatcher.Invoke(() =>
{
...// your code here.
});
此解决方案不是异步方法。如何将上面的代码变成异步方法?
【问题讨论】:
-
简短的回答是您希望从 UI 中读取值(例如滑块值)并将它们存储在局部变量中在调用
Task.Run之前。
标签: c# wpf asynchronous