Task.Run()如何传递其他线程拥有的对象?

时间:2017-06-27 19:06:48

标签: c# multithreading xaml async-await task-parallel-library

我如何将textBox UI元素的文本传递给Task.Run()方法?此代码将抛出异常(...其他线程拥有它)。当我传递过滤变量时,异常就消失了,这是因为字符串是作为值传递的吗?

private async void filterTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    if (currentSession.SessionFilenames != null)
    {
        string filter = filterTextBox.Text;
        dirListing.ItemsSource = await Task<IEnumerable<string>>.Run(()=> Filterfiles(filterTextBox.Text));
    }
}

1 个答案:

答案 0 :(得分:3)

您不能在拥有该对象的线程之外的线程中使用具有线程关联性的对象(例如TextBox对象)。

但是大多数对象具有线程亲和力。它们不归任何特定线程所有,可以在任何地方使用。其中包括string返回的filterTextBox.Text对象,您将其存储在filter局部变量中。

所以,只需使用该值:

dirListing.ItemsSource = await Task.Run(()=> Filterfiles(filter));

请注意,您不需要为Task.Run()方法调用指定类型参数。编译器将根据调用中使用的表达式推断类型。