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

标签 c# .net multithreading unit-testing

我需要定制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/

相关文章:

c# - 当两个字符串可互换时,如何为具有两个字符串的结构实现 GetHashCode

C# 将 ListView 项目与对象绑定(bind)

c# - 带有字符串键的字典出现 KeyNotFoundException

.net - 如何在不等待存储过程完成的情况下调用存储过程?

c++ - Windows 多任务破坏了 OpenCL 性能

c# - 异步等待和线程

c# - Selenium 如何使用 chromedriver 和 C# 清除缓存

.net - 是否有工具可以简化 Reflection.Emit 的工作?

.net - 如何在MSBuild中访问错误详细信息

c# - 获取跨线程操作在 SetWindowPos() 中无效