Winforms 从TaskScheduler.FromCurrentSynchronizationContext()更改用于单元测试的计划程序

Winforms 从TaskScheduler.FromCurrentSynchronizationContext()更改用于单元测试的计划程序,winforms,unit-testing,task-parallel-library,moq,Winforms,Unit Testing,Task Parallel Library,Moq,我正在运行一个需要更新GUI的Windows窗体应用程序,因此必须使用来自当前同步上下文的调度程序。代码:TaskScheduler.FromCurrentSynchronizationContext() 在编写单元测试时,需要切换此调度程序,因为我们希望使用自己的调度程序在测试中并发和同步地运行内容。有其他选择(注射,手动重置事件),但这很难看,我们不想要它 可以通过使用反射覆盖私有变量来修改TaskScheduler.Default,这很好,但是对于TaskScheduler.FromCur

我正在运行一个需要更新GUI的Windows窗体应用程序,因此必须使用来自当前同步上下文的调度程序。代码:TaskScheduler.FromCurrentSynchronizationContext()

在编写单元测试时,需要切换此调度程序,因为我们希望使用自己的调度程序在测试中并发和同步地运行内容。有其他选择(注射,手动重置事件),但这很难看,我们不想要它

可以通过使用反射覆盖私有变量来修改TaskScheduler.Default,这很好,但是对于TaskScheduler.FromCurrentSynchronizationContext(),没有明显的方法可以做到这一点


那么,您是如何做到这一点的呢?

在单元测试场景中,一件可能有效的事情是创建一个继承自
SynchronizationContext
TestSynchronizationContext
,并将其分配给
SynchronizationContext.SetSynchronizationContext()
。您的
TestSynchronizationContext
类将重写
Post
方法,改为重定向到
Send
方法,使其同步运行


您可以找到源代码以供参考。

依赖注入有多丑陋?至少对我来说这听起来很可笑。对我来说,听起来你试图实现的(覆盖私有变量的反射)是多么丑陋。更好的方法是注入一个返回调度程序的工厂或注入调度程序本身?我想你把它混在一起了:)是的,好吧,我提到的最难看的事情就是这件事。注入看起来确实更好,但实际的问题仍然是:如何更改TaskScheduler.FromCurrentSynchronizationContext()中的调度程序?发布一些代码来演示如何使用
TaskScheduler.FromCurrentSynchronizationContext
,以便我们能够轻松回答.Omg。我无法在这里格式化我的回复,但这里有一个SyncContext的代码,它不使用线程池进行工作:
public类InvokeNowSynchronizationContext:SynchronizationContext{public override void Post(SendOrPostCallback d,object state){d.Invoke(state);}public override void Send(SendOrPostCallback d,对象状态){d.Invoke(状态);}}