c#在不使用dispatcher的情况下访问任务中的ui元素

c#在不使用dispatcher的情况下访问任务中的ui元素,c#,.net,wpf,multithreading,task-parallel-library,C#,.net,Wpf,Multithreading,Task Parallel Library,我希望在一个单独的线程中找到一种访问/操作ui元素(如textbox)属性的机制,但使用Dispatcher访问它意味着对ui线程进行控制,从而阻止用户做任何事情(这是我不想做的——冻结ui…) 因此,我实际上希望从一个单独的线程访问ui,而不需要冻结主ui线程。在您的情况下,您必须使用静态类和静态事件,从任务触发事件,并在视图模型/code隐藏中处理事件,并在该事件处理程序中执行您想要的任何操作 在您的情况下,您必须将静态类与静态事件一起使用,从任务触发事件,并在视图模型/code隐藏中处理事

我希望在一个单独的线程中找到一种访问/操作ui元素(如textbox)属性的机制,但使用Dispatcher访问它意味着对ui线程进行控制,从而阻止用户做任何事情(这是我不想做的——冻结ui…)


因此,我实际上希望从一个单独的线程访问ui,而不需要冻结主ui线程。

在您的情况下,您必须使用
静态
静态事件
,从
任务
触发事件,并在
视图模型/code隐藏
中处理事件,并在该
事件处理程序中执行您想要的任何操作

在您的情况下,您必须将
静态
静态事件
一起使用,从
任务
触发事件,并在
视图模型/code隐藏
中处理事件,然后在该
事件处理程序中执行任何您想要的操作

您无法访问另一个线程上UI元素的依赖项属性。这是不允许的

但是,更新文本属性的速度非常快,这很可能不是您的瓶颈。计算该文本属性的值可能很慢。因此,例如,如果您有一个从UI触发的事件,您可以生成一个任务,该任务将在另一个线程上运行,并保持UI响应

当值准备就绪时,wait左侧的代码将在UI线程上运行,然后您可以修改所需的任何UI属性

SomeEvent += async (s,e) => {

   var text = await Task.Run(()=>{
    return SomeVeryExpensiveOperation();          
   });

   MyTextBox.Text = text;

}
这里有一个更详细的例子


您无法访问其他线程上UI元素的依赖项属性。这是不允许的

但是,更新文本属性的速度非常快,这很可能不是您的瓶颈。计算该文本属性的值可能很慢。因此,例如,如果您有一个从UI触发的事件,您可以生成一个任务,该任务将在另一个线程上运行,并保持UI响应

当值准备就绪时,wait左侧的代码将在UI线程上运行,然后您可以修改所需的任何UI属性

SomeEvent += async (s,e) => {

   var text = await Task.Run(()=>{
    return SomeVeryExpensiveOperation();          
   });

   MyTextBox.Text = text;

}
这里有一个更详细的例子


在我看来,使用Dispatcher正是您想要做的事情。只要你确保你的UI线程没有过载,没有数以百万计的快速更新,它就不应该冻结它。我必须访问很多UI元素并对其进行操作。。所以他们不是百万,但是的,他们足以让用户做任何事情,或者让UI线程超慢,这是我不想要的…你不能从另一个线程修改UI,就是这样。你永远不可能。这可以追溯到Windows95。其他OSs和windowing系统也有同样的限制。您的实际问题是什么?为什么您认为需要从多个线程修改UI?到底是什么花了太长时间?您是否使用低效的UI代码?您是否尝试在一次只能显示50行的数据网格中加载10000行?在等待数据来自数据库时,您是否阻塞了UI?查看Stephen Cleary的MSDN杂志文章使用Dispatcher正是您想要做的,据我所知。只要你确保你的UI线程没有过载,没有数以百万计的快速更新,它就不应该冻结它。我必须访问很多UI元素并对其进行操作。。所以他们不是百万,但是的,他们足以让用户做任何事情,或者让UI线程超慢,这是我不想要的…你不能从另一个线程修改UI,就是这样。你永远不可能。这可以追溯到Windows95。其他OSs和windowing系统也有同样的限制。您的实际问题是什么?为什么您认为需要从多个线程修改UI?到底是什么花了太长时间?您是否使用低效的UI代码?您是否尝试在一次只能显示50行的数据网格中加载10000行?您是否在等待来自数据库的数据时阻塞UI?请查看Stephen Cleary在MSDN杂志上的文章