C# 自动调用跨线程操作

C# 自动调用跨线程操作,c#,wpf,multithreading,task-parallel-library,C#,Wpf,Multithreading,Task Parallel Library,对于这种情况是否有解决方案: 我在一个新线程上做一些耗时的事情(使用任务)。在这个线程中,我想更新UI元素(文本),以便用户知道发生了什么。这应该实时发生,而不仅仅是在任务完成时 如果要更改某些内容,我必须始终显式调用Dispatcher.Invoke()(它是UI线程调度程序)。有没有一种方法可以在不需要显式调用的情况下异步运行某些东西?我找到了一个使用TaskFactory并指定TaskScheduler的解决方案。但这会在进行UI调用时锁定UI 有没有办法做到这一点,而不锁定用户界面 编辑

对于这种情况是否有解决方案:

我在一个新线程上做一些耗时的事情(使用任务)。在这个线程中,我想更新UI元素(文本),以便用户知道发生了什么。这应该实时发生,而不仅仅是在任务完成时

如果要更改某些内容,我必须始终显式调用Dispatcher.Invoke()(它是UI线程调度程序)。有没有一种方法可以在不需要显式调用的情况下异步运行某些东西?我找到了一个使用TaskFactory并指定TaskScheduler的解决方案。但这会在进行UI调用时锁定UI

有没有办法做到这一点,而不锁定用户界面

编辑:由于一些轻微的误解,这次编辑。 一旦我打电话给这样的人

uiControl.Text = "Test 123";

如果需要,将在UI线程上自动调用工作线程。所以在这种情况下需要它,但我想摆脱所有这些调用。因此,如果有一个漂亮的解决方案,它将是伟大的。否则,我必须使用显式调用,虽然不是很好,但还行。

您可以在主线程上执行该操作,只需不时调用Application.DoEvents(),即可处理UI事件

请注意,这只适用于winforms,因此可能不是正确答案

HighCore建议这是一个更好的答案

已将其作为方法级方面实现。就实现而言,它意味着用
[DispatchedMethod]
属性修饰一个方法,并且每次调用它时(由任何线程调用)它都会被调度到UI线程。请查看此处以了解更多详细信息:


如果您正在寻找异步,请使用Dispatcher.BeginInvoke()。谢谢,我知道这一点。但这并不能回答我的问题。我想隐式地调用。当我在工作线程中调用类似“textbox.Text='Bla';”的东西时,它应该自动被UI线程调用。这就是我想知道的,如果可能的话;)@HighCore:你的解决方案很有意义,但我有标准的UI控件,比如WPF文本框。因此,我无法为可能使用的每个属性添加自定义NotifyPropertyChanged调用。。。或者我目前不明白这有助于解决我的问题:D@ZapStorm是的,您需要一个适当的ViewModel,它通过将每个相关属性编组到UI线程(如我的链接答案中所示)来为每个相关属性引发
PropertyChanged
,而不管UI元素是什么,这是WPF中的正确方法。你已经看完我的答案了吗?您不需要
textbox.Text=bla在WPF中,因为您必须使用适当的数据绑定。好的,谢谢,这不是一个完美的解决方案,但至少在某些情况下,它有助于减少所需的调用。显然没有通用的解决方案,但没关系。如果一切都是自动化的,编程就会变得容易:数据是
WPF
,而不是
WinForms
<代码>应用程序.DoEvents()
在WPF中不存在。-1这是人类历史上最糟糕的建议
DoEvents()
是邪恶的,即使在winforms中也是如此。@HighCore是的,但这是一个建议,它解决了问题-你的答案是什么?@Bogdan
你的答案是什么?
-你也知道这些“方面”是如何形成的吗?这个想法非常漂亮,但是我真的不知道如何获取属性来获取调用并分派它们……好吧,因为这似乎属于AOP(面向方面编程),这对于我这里的问题来说有点过分了。我没有钱买PostSharp,所以我会保留它。但是谢谢,我收集了更多的知识:)