C# 我可以使用什么同步?

C# 我可以使用什么同步?,c#,C#,我在C语言中工作,我正在寻找一种机制来同步我的应用程序 我有一个功能来管理我的应用程序中的异常,处理多线程。当出现异常时,将调用一个函数,进行一些处理并请求用户检查 如果在第一个异常正在进行时引发新异常,我希望等待第一个异常,并在第一个异常执行函数后不执行任何操作 我怎样才能正确地做到这一点 我的草稿: private void onAnomaly(enumAnomaly err) { if (anomalyInProgress) //wait retur

我在C语言中工作,我正在寻找一种机制来同步我的应用程序

我有一个功能来管理我的应用程序中的异常,处理多线程。当出现异常时,将调用一个函数,进行一些处理并请求用户检查

如果在第一个异常正在进行时引发新异常,我希望等待第一个异常,并在第一个异常执行函数后不执行任何操作

我怎样才能正确地做到这一点

我的草稿:

private void onAnomaly(enumAnomaly err)
{
    if (anomalyInProgress)
        //wait
        return;
    else
        anomalyInProgess = true;
        //do something
        anomalyInProgess = false;
}
你可以用

根据您的评论进行编辑,您需要其他功能等待。可以通过添加锁定对象来实现这一点

private int anomalyInProgress = 0;
private Object _lock = new Object();

private void onAnomaly(enumAnomaly err)
{
    //Here, the value of anomalyInProgress will be set to 1, but
    // Exchange return the value before the change.
    // So if it was 0 before, it means nobody is already executing this code
    //and we can safely enters
    if (0 == Interlocked.Exchange(anomalyInProgress, 1))
    {
        lock (_lock)
        {
            //do something

            //we reset the value of anomalyInProgress so the next one can enter in safely
            Interlocked.Exchange(anomalyInProgress, 0)
        }
    } 
    else 
    {
        //I cannot take the lock directly, because I could be taking it before the 'True' condition.
        Threading.Thread.Sleep(1)
        lock (_lock) //This will wait for the 'True' condition to finish
        {
        }
    }
}

当引发异常时,可以锁定您调用的函数

object lockObj = new object();
lock(lockObj)
{
    //function called once anomaly raised
}

希望这能有所帮助。

我找到了一种锁的方法,也许不是最好的,但似乎很管用

private object anomalyLock = new object();
private Queue<enumAnomaly> anomalyQueue = new Queue<enumAnomaly>();

private void onAnomaly(enumAnomaly err)
{
    anomalyQueue.Enqueue(err);

    lock (anomalyLock)
    {
        if (anomalyQueue.Count == 0)
            return;

        //do something

        // UserAck

        anomalyQueue.Clear();
    }
}

有没有最好的方法?

带锁的程序正在等待第一个,但在我没有得到这个部分后执行代码-在第一个函数执行后什么也不做?您的意思是说,在处理第一个异常时,您希望在处理新异常之前等待。第一个异常完成后,您需要开始处理新到达的异常。我的理解正确吗?@RBT我会为糟糕的英语解释更多对不起。在我的应用程序中,我有许多类型的异常和一个函数来删除所有异常。异常A和异常B通常由相同的函数删除。此函数结束时,将打开一个弹出窗口,要求用户进行检查。如果在异常A处于onAnomaly时引发异常B,则B必须等待onAnomaly用户确认结束,但不能调用onAnomaly,因为用户已使弹出窗口有效。我可能会出错,但对我来说,锁正在等待异常引发后调用的函数。第一次通话结束后,第二次通话开始。这几乎是我想要的,但我只需要调用一次函数,我对Amey Kamat说,锁将执行两次或更多次。我想做些什么但不想在完成后重做不要忘记在完成后将anomalyInProgress设置回0,否则将来的任何调用也将被丢弃。@SuperPeanut我只是测试了这个解决方案,我不觉得它会等待第一个函数。也许我可以将此解决方案与ManualResetEvent混合使用,但是否有高效和安全的解决方案?@FacticiusVir更新答案,在第二次交换呼叫时犯了一个小错误它工作得非常好!谢谢你忘记了关键字ref,但这是一个细节^^^风险!在获取锁之前,两个异常可以同时排队。您只处理队列前面的一个队列,然后清除整个队列。您甚至可能无法处理队列中的其他异常。我认为这是一种可能性,除非您在//do something部分透露如何处理队列。您最初的问题陈述仍然是,在前一个异常未完全处理之前,您不希望开始处理任何异常。不是吗?在这种情况下,我真的不在乎锁前是否有多个异常。但您是对的,如果用户ack和队列之间出现异常,则存在风险。清除。但是我没有更好的办法了。你能试试我用Interlocated.exchange提供的解决方案吗?我想它正是你所需要的…我已经尝试过了,但是互锁的。交换没有等待我的功能的结束ack@A.Pissicat再次编辑,所以现在我等待结束