【问题标题】:Task.Run() how to pass object owned by other thread?Task.Run() 如何传递其他线程拥有的对象?
【发布时间】:2017-06-27 19:06:48
【问题描述】:

例如,我如何将 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));
    }
}

【问题讨论】:

  • 是的,就是这样
  • 基本上,是的 :-) 阅读更多内容here。但相反的情况并非如此:文本框失败是因为文本框是 control on the UI thread,而不是因为它通过 ref 与 val 传递。

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


【解决方案1】:

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

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

因此,只需使用该值即可:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多