有没有办法在c#中没有上下文切换的情况下强制执行原子操作?

Geo*_*uer 0 .net c# multithreading

我有几行方法,我想确保在执行这些方法时没有上下文切换到另一个线程?是的,重新架构是一种选择,但如果我能做到这一点,那将是更加便利的.

这可能吗?如果没有,那么有人知道决定背后的原因吗?

编辑:我问的原因是我有一个负责返回值的类,该值是通过事件提供的,因此当调用GetValue()时,线程需要阻塞直到引发事件.所以我们有:

public class ValueResolver {
  IPersistentNotifier _notifier;
  IValueMonitor _monitor;
  Value _value;
  ManualResetEvent _resolvedEvent = new ManualResetEvent(false);
  public ValueResolver(IPersistentNotifier notifier, IValueMonitor monitor) {
    _notifier = notifier;
    _monitor = monitor;
    _monitor.ValueAcquired += ValueAcquired;
  }
  public Value GetValue() {
    _value = null;
    persistentNotifier.Show("Getting Value")
    _monitor.Start();
    _resolvedEvent.WaitOne(60000, false);
    return _value
  }
  public void ValueAcquired(Value val) {
    _value = val;
    _monitor.Stop();
    _notifier.Hide();
    _resolvedEvent.Set();
  }
}
Run Code Online (Sandbox Code Playgroud)

只有我能想到为此编写测试的方式就像(在犀牛嘲笑中)

var monitor = MockRepository.GetMock<IValueMonitor>() 
monitor.Expect(x=>x.Start()).Do(new Action(() => {
  Thread.Sleep(100);
  monitor.Raise(y=>y.ValueAcquired, GetTestValue());
}); 
Run Code Online (Sandbox Code Playgroud)

但欢迎任何建议.

Jon*_*eet 9

不,你不能.你可以使用一个锁来确保没有其他线程会输入敏感的代码片段来处理你的操作,但这就是全部.

至于"为什么" - 它通常不需要,并且在相对高级别的平台上的先发制人操作系统中会略显奇怪.它可能在驱动程序代码中,但在用户代码中通常不需要它.

请注意,"运行其他线程"并不一定意味着在多核和多处理器计算机的情况下进行上下文切换.

编辑:尽管你的编辑,我仍然不明白为什么这是一个上下文切换的问题.如果线程无论如何都要阻塞,那么它几乎必然会被上下文切换到另一个线程.我同意这是一个你必须等待(比方说)100毫秒左右有信心,你的测试将让一切发生,你需要其他的线程上略有烦恼,但你绝对不会需要确保它赢得了" t上下文切换.