我需要定制SynchronizationContext那:
- 拥有一个运行“Posts”和“Sends”委托(delegate)的线程
- 是否按照发送顺序发送
- 不需要其他方法
我需要这个,这样我就可以对一些线程代码进行单元测试,这些代码将在实际应用程序中与 WinForm 对话。
在我自己写之前,我希望有人能给我指出一个简单(和小)的实现。
最佳答案
这个是我前段时间写的,没有版权问题,也没有保证(系统没有上线):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Threading;
namespace ManagedHelpers.Threads
{
public class STASynchronizationContext : SynchronizationContext, IDisposable
{
private readonly Dispatcher dispatcher;
private object dispObj;
private readonly Thread mainThread;
public STASynchronizationContext()
{
mainThread = new Thread(MainThread) { Name = "STASynchronizationContextMainThread", IsBackground = false };
mainThread.SetApartmentState(ApartmentState.STA);
mainThread.Start();
//wait to get the main thread's dispatcher
while (Thread.VolatileRead(ref dispObj) == null)
Thread.Yield();
dispatcher = dispObj as Dispatcher;
}
public override void Post(SendOrPostCallback d, object state)
{
dispatcher.BeginInvoke(d, new object[] { state });
}
public override void Send(SendOrPostCallback d, object state)
{
dispatcher.Invoke(d, new object[] { state });
}
private void MainThread(object param)
{
Thread.VolatileWrite(ref dispObj, Dispatcher.CurrentDispatcher);
Console.WriteLine("Main Thread is setup ! Id = {0}", Thread.CurrentThread.ManagedThreadId);
Dispatcher.Run();
}
public void Dispose()
{
if (!dispatcher.HasShutdownStarted && !dispatcher.HasShutdownFinished)
dispatcher.BeginInvokeShutdown(DispatcherPriority.Normal);
GC.SuppressFinalize(this);
}
~STASynchronizationContext()
{
Dispose();
}
}
}
关于c# - 寻找自定义 SynchronizationContext 的示例(单元测试需要),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1882417/