当前位置: 首页 > 编程语言 > C#

寻找自定义SynchronizationContext的示例(单元测试需要)Share

时间:2023-04-11 03:13:08 C#

寻找自定义SynchronizationContext的示例(单元测试需要)隔离的线程代码,将在实际应用程序中与WinForm对话。在我自己写之前,我希望有人能给我指出一个简单(和小)的实现。这个是我前一段时间写的,没有版权问题,也没有担保(系统没有投入生产):usingSystem;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用系统线程;使用System.Windows.Threading;命名空间ManagedHelpers.Threads{publicclassSTASynchronizationContext:SynchronizationContext,IDisposable{privatereadonlyDispatcherdispatcher;私有对象dispObj;私有只读线程mainThread;publicSTASynchronizationContext(){mainThread=newThread(MainThread){Name="STASynchronizationContextMainThread",IsBackground=false};mainThread.SetApartmentState(ApartmentState.STA);mainThread.Start();//等待获取主线程的调度器while(Thread.VolatileRead(refdispObj)==null)Thread.Yield();dispatcher=dispObj作为调度程序;}publicoverridevoidPost(SendOrPostCallbackd,objectstate){dispatcher.BeginInvoke(d,newobject[]{state});}publicoverridevoidSend(SendOrPostCallbackd,objectstate){dispatcher.Invoke(d,新对象[]{状态});}privatevoidMainThread(objectparam){Thread.VolatileWrite(refdispObj,Dispatcher.CurrentDispatcher);Console.WriteLine("MainThreadissetup!Id={0}",Thread.CurrentThread.ManagedThreadId);Dispatcher.Run();}publicvoidDispose(){if(!dispatcher.HasShutdownStarted&&!dispatcher.HasShutdownFinished)dispatcher.BeginInvokeShutdown(DispatcherPriority.Normal);GC.SuppressFinalize(这个);}~STASynchtext(){处置();idesign.net(在页面上搜索自定义同步上下文)有一个SynchronizationContext可以完成这项工作,但我需要它们更复杂并且有类似的要求-对服务器组件进行单元测试,以确认其回调委托调用是编组到适当的SynchronizationContext并提出以下代码(基于StephenToub的博客文章http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx)我使用它自己的内部线程来处理Post()/Send()请求,而不是依赖WPF/Winforms/..来执行调度。//一个简单的SynchronizationContext,它封装了它自己的专用任务队列和处理//用于服务Send()和Post()调用的线程。//基于http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx但使用它自己的线程//而不是在它在公共密封类DedicatedThreadSynchronisationContext上实例化的线程上运行:SynchronizationContext,IDisposable{publicDedicatedThreadSynchronisationContext(){m_thread=newThread(ThreadWorkerDelegate);m_thread.Start(这个);}publicvoidDispose(){m_queue.CompleteAdding();}///向同步上下文发送异步消息。///要调用的System.Threading.SendOrPostCallback委托。///传递给委托的对象。publicoverridevoidPost(SendOrPostCallbackd,objectstate){if(d==null)thrownewArgumentNullException("d");m_queue.Add(newKeyValuePair(d,state));}///作为公共覆盖voidSend(SendOrPostCallbackd,objectstate){using(varhandledEvent=newManualResetEvent(false)){Post(SendOrPostCallback_BlockingWrapper,Tuple.Create(d,state,handledEvent));}handledEvent.WaitOne();}}publicintWorkerThreadId{get{返回m_thread.ManagedThreadId;}}//=========================================================================================privatestaticvoidSendOrPostCallback_BlockingWrapper(对象状态){varinnerCallback=(状态为元组);尝试{innerCallback.Item1(innerCallback.Item2);}最后{innerCallback.Item3.Set();}}///工作项队列。privatereadonlyBlockingCollection>m_queue=newBlockingCollection>();私有只读线程m_thread=null;///运行一个循环来处理所有排队的工作项。privatevoidThreadWorkerDelegate(objectobj){SynchronizationContext.SetSynchronizationContext(objasSynchronizationContext);try{foreach(varworkIteminm_queue.GetConsumingEnumerable())workItem.Key(workItem.Value);}catch(ObjectDisposedException){}}}我已经修改了Bond的答案以消除对WPF(Dispatcher)的依赖并依赖WinForms:示例共享的全部内容(单元测试需要),如果它对每个人都有用并且需要了解更多C#学习教程,希望大家多多关注—namespaceManagedHelpers.Threads{usingSystem;使用System.Collections.Generic;使用系统。使用System.Linq;使用系统文本;使用系统线程;使用System.Threading.Tasks;使用System.Windows.Forms;使用NUnit.Framework;公共类STASynchronizationContext:SynchronizationContext,IDisposable{privatereadonlyControlcontrol;只读intmainThreadId;publicSTASynchronizationContext(){this.control=newControl();这个.control.CreateControl();this.mainThreadId=Thread.CurrentThread.ManagedThreadId;if(Thread.CurrentThread.Name==null){线程。CurrentThread.Name="AsynchronousTestRunner主线程";}}publicoverridevoidPost(SendOrPostCallbackd,objectstate){control.BeginInvoke(d,newobject[]{state});}publicoverridevoidSend(SendOrPostCallbackd,objectstate){控制。调用(d,新对象[]{状态});}publicvoidDispose(){断言。AreEqual(this.mainThreadId,Thread.CurrentThread.ManagedThreadId);这个。处置(真);GC.SuppressFinalize(这个);}protectedvirtualvoidDispose(booldisposing){Assert.AreEqual(this.mainThreadId,Thread.CurrentThread.ManagedThreadId);如果(处置){如果(控制!=null){control.Dispose();}}}~STASynchronizationContext(){this.Dispose(false);}}}本文收集自网络,不代表立场。侵权请点击维权联系管理员删除如需转载请注明出处: