小编rev*_*ane的帖子

使用async/await时,使用自定义SynchronizationContext序列化执行

我的团队正在使用C#5.0中的async/await开发一个多线程应用程序.在实现线程同步的过程中,经过几次迭代,我们想出了一个(可能是新颖的?)新的SynchronizationContext实现,它有一个内部锁:

  1. 在致电Post时:
    • 如果可以进行锁定,则立即执行委托
    • 如果无法获取锁定,则委托将排队
  2. 致电发送时:
    • 如果可以执行锁定,则执行委托
    • 如果无法进行锁定,则线程被阻止

在所有情况下,在执行委托之前,上下文将自身设置为当前上下文,并在委托返回时恢复原始上下文.

这是一个不寻常的模式,因为我们显然不是第一个写这样的应用程序的人,我想知道:

  1. 这种模式真的很安全吗?
  2. 有没有更好的方法来实现线程同步?

这是SerializingSynchronizationContext的源代码和GitHub上的一个演示.

以下是它的使用方法:

  • 每个需要保护的类都会像互斥锁一样创建自己的上下文实例.
  • 上下文是可以接受的,因此可以使用以下语句.

    await myContext;

    这只会导致方法的其余部分在上下文的保护下运行.

  • 该类的所有方法和属性都使用此模式来保护数据.在等待之间,一次只能有一个线程在上下文中运行,因此状态将保持一致.当达到await时,允许下一个计划的线程在上下文中运行.
  • 如果需要,自定义SynchronizationContext可以与AsyncLock结合使用,即使在等待表达式的情况下也能保持原子性.
  • 类的同步方法也可以使用自定义上下文进行保护.

.net c# synchronizationcontext async-await

7
推荐指数
1
解决办法
2496
查看次数

标签 统计

.net ×1

async-await ×1

c# ×1

synchronizationcontext ×1