使用任务输入参数和结果

时间:2016-09-07 19:38:37

标签: c# multithreading task

所以,我想使用新的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表达式。我从来没有真正使用它们,所以我(起初)试图找到一种更冗长的方式来完成同样的事情。

谢谢!

2 个答案:

答案 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"]