所以,我想使用新的Task类(多年前我会使用BackgroundWorker)来执行以下操作,但我不确定如何使它工作。道歉,我生锈了......
internal bool DoThisThing(string input) {...} // Takes a while.
private void toggleButton_Click(object sender, RoutedEventArgs e)
{
string toggleButtonName = "hi!";
Func<string, bool> delToUse = new Func<string, bool>(DoThisThing); // Delgate of appropriate type
Task<bool> task = new Task<bool>(delToUse); // Doesn't like this. Something I can do instead?
... // do other things for a while
// Task takes a while, don't want to block UI thread, use Task.
task.Start(toggleButtonName); // Looks like Start method doesn't allow input parameters for the assigned delegate like this. How can I accomplish something similar?
... keep on going and let Task finish. Maybe check the result, maybe not.
}
希望这有道理吗?
从我从搜索中看到的,看起来最常使用Lambda表达式。我从来没有真正使用它们,所以我(起初)试图找到一种更冗长的方式来完成同样的事情。
谢谢!
答案 0 :(得分:1)
最佳选择是使用这样的lambda表达式:
string toggleButtonName = "hi!";
Task<bool> task = Task.Run(() => delToUse(toggleButtonName));
但是,在循环中要小心这样做。如果您正在使用的变量未在循环的迭代中初始化您运行任务,则它可能会更改并产生意外结果。为避免出现问题,请重新初始化循环中的变量,如下所示:
for(int i = 0; i < 10; i++)
{
// Don't do this!!!!
Task<int> task = Task.Run(() => doStuff(i));
// Do this!!!
string j = i;
Task<int> task = Task.Run(() => doStuff(j));
}
在第一个示例中,doStuff()
会将i
解析为运行任务时的值,而不是调用Task.Run()
时的值。'<a title="Details" class="btn btn-sm btn-outline grey-salsa"
onclick="openModal(\"#div1\", \"#div2\")"><i class="fa fa-search"></i></a>'
。将值复制到当前作用域中创建的变量将解决此问题,这是我们在第二个示例中所做的。 (显然,对于参考对象,这不起作用)
如果您安装了Resharper,如果它看到它,它实际上应该警告您。
答案 1 :(得分:0)
从我在搜索中看到的情况来看,Lambda表达式看起来最常用。我从来没有真正使用它们,所以我(起初)试图找到一种更冗长的方式来完成同样的事情。
使用Lambdas!但是,嘿,如果你不想,只需使用普通的无聊方法;)
items[0]["location"]!["store"]