当前位置:  开发笔记 > 编程语言 > 正文

有没有办法在C#中将代码标记为非线程安全?

如何解决《有没有办法在C#中将代码标记为非线程安全?》经验,为你挑选了1个好方法。

我试图追捕一个竞争条件,我遇到了许多可疑的功能.其中大多数不允许同时从两个线程调用,但很难确保它们不会.

一个函数并行执行时,是否有一些关键字指示运行时抛出异常?我知道当另一个线程修改我枚举的集合时,我有时会得到一个异常,但这样的保护措施是否足够依赖?

运行时可以使用lock指令暂停执行,所以我需要的只是lock抛出错误.



1> Steven..:

您可以使用Monitor.TryEnter:

bool entered = !Monitor.TryEnter(someLockObject);
try
{
    if (!entered)
        throw Exception("Multi-thread call!");

    // Actual code
}
finally
{
    if (entered)
    {
        Monitor.Exit(someLockObject);
    }
}

将代码包装在自己的类中会很好:

public sealed class MultiThreadProtector : IDisposable
{
    private object syncRoot;

    public MultiThreadProtector(object syncRoot)
    {
        this.syncRoot = syncRoot;

        if (!Monitor.TryEnter(syncRoot))
        {
            throw new Exception("Failure!");
        }
    }

    public void Dispose()
    {
        Monitor.Exit(this.syncRoot);
    }
}

这样你就可以按如下方式执行它:

using (new MultiThreadProtector(someLockObject))
{
    // protected code.
}

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有