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

标签 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));
    }
}

最佳答案

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

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

所以,只需使用该值即可:

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

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

关于c# - Task.Run() 如何传递其他线程拥有的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44788011/

相关文章:

c# - 旋转后更改 WPF 元素的父元素(设置新坐标问题)

用于两个线程之间通信的C++多线程数据结构

python - 线程内的 print() 输出错误的值

wpf - 如何为一个控件编写改变另一个控件宽度的样式?

c# - 带有 EnableSSL 的 FtpWebRequest

c# - 如何将数据从打开的窗口发送回 WPF 中的打开器

java - Websphere ScheduledExecutorService 线程

c# - WPF:设置属性不会在文本框值更改时触发

android - 等效于 FrameLayout 的 Xamarin.Forms 布局

c# - 在任何子方法之前(或之后)调用父方法