C#线程锁定失败

C#线程锁定失败,c#,multithreading,C#,Multithreading,我有两个工作线程。我用同一个锁锁定了这两个线程,但threadB在threadA之前执行,所以出现异常。我用同一个锁对象锁定了这两个线程。线程B使用委托函数。我如何解决这个问题 详细资料: 我有一个叫做statemulation的类。 其中有两个函数被称为 a) OnSimulationCollisionReset b) OnSimulationProgressEvent 实施方式如下: private void OnSimulationCollisionReset() { Threa

我有两个工作线程。我用同一个锁锁定了这两个线程,但threadB在threadA之前执行,所以出现异常。我用同一个锁对象锁定了这两个线程。线程B使用委托函数。我如何解决这个问题

详细资料:


我有一个叫做
statemulation
的类。 其中有两个函数被称为 a)
OnSimulationCollisionReset
b)
OnSimulationProgressEvent

实施方式如下:

private void OnSimulationCollisionReset()
{
    Thread XmlReset = new Thread(XmlResetFn);
    XmlReset.Start();
}

private void OnSimulationProgressEvent()
{
    DataStoreSingleTon.Instance.IsResetCompleted = true;
    Thread ThrdSimulnProgress = new Thread(SimulnProgress);
    ThrdSimulnProgress.Start();
}
其中
SimulnProgress()
XmlResetFn()
如下所示:

private void SimulnProgress()
{
    //uses a delegate 
    UIControlHandler.Instance.ShowSimulationProgress();
}

private void XmlResetFn()
{
    DataStoreSingleTon.Instance.GetFPBConfigurationInstance().ResetXmlAfterCollision();
}
其中,
OnSimulationProgressEvent()
正在使用委托函数

showSimulationProgress
ResetXML…()
都使用相同的资源
FPBArrayList

我的要求是
SimulationProgressEvent()
应该只有在
Reset.()
之后才能工作。在
resetXML..()
中,我清除
FPBList
。 在
SimulationProgress()
I访问
FPBList[I]
其中
I:0-->size
我使用同一个锁定对象锁定了两个函数。我希望,
reset()
将首先完成。但在输入重置后,在完成重置之前,
showProgress()
启动并发生异常

如何解决我的问题

这就是我锁定函数的方式

public System.Object lockThis = new System.Object();

private void SimulnProgress()
{
    lock (lockThis)
    {
        UIControlHandler.Instance.ShowSimulationProgress();
    }
}

private void XmlResetFn()
{
    lock (lockThis)
    {
        DataStoreSingleTon.Instance.GetFPBConfigurationInstance().ResetXmlAfterCollision();
    }
}
请给出一个解决方案。 当做
Nidhin KR

锁用于防止多个线程同时进入给定的代码段。它们不打算以任何其他方式同步线程,比如让线程以特定顺序执行代码

要强制执行顺序,您需要在线程之间实现一些信令。
具体来说,这可能是您想要的。

锁旨在防止多个线程同时进入给定的代码段。它们不打算以任何其他方式同步线程,比如让线程以特定顺序执行代码

要强制执行顺序,您需要在线程之间实现一些信令。
具体来说,这可能是您想要的。

编写多线程代码,假设或要求在不同线程上以特定顺序执行,这不是一个好主意。多线程的全部要点是允许相互独立地执行。独立意味着没有明确或暗示特定的顺序。CPU时间可能不会均匀分布在两个线程之间,例如,一个线程正在等待外部信号事件,而另一个线程在计算循环中

对于您的特定代码,
IsResetCompleted=true似乎很奇怪在OnSimulationProgressEvent处理程序中设置。重置活动的完成状态应该由重置活动设置,而不是由在另一个线程中执行的其他事件设置,假设“如果我们在这里,那么另一个线程中的工作必须完成”

您应该检查您的设计,并确定线程之间的假设和依赖关系。如果线程B必须在线程A完成某项任务后才能继续,则应首先重新检查为什么要将此工作放在不同的线程中,然后可能使用同步对象(如AutoResetEvent)来协调线程之间的关系


这里的关键点是,如果您接受一个顺序任务并将其拆分为多个线程,但是线程使用锁或同步对象来序列化其执行,那么使用多个线程没有任何好处。操作仍然是顺序的。

编写假定或要求在不同线程上以特定顺序执行的多线程代码不是一个好主意。多线程的全部要点是允许相互独立地执行。独立意味着没有明确或暗示特定的顺序。CPU时间可能不会均匀分布在两个线程之间,例如,一个线程正在等待外部信号事件,而另一个线程在计算循环中

对于您的特定代码,
IsResetCompleted=true似乎很奇怪在OnSimulationProgressEvent处理程序中设置。重置活动的完成状态应该由重置活动设置,而不是由在另一个线程中执行的其他事件设置,假设“如果我们在这里,那么另一个线程中的工作必须完成”

您应该检查您的设计,并确定线程之间的假设和依赖关系。如果线程B必须在线程A完成某项任务后才能继续,则应首先重新检查为什么要将此工作放在不同的线程中,然后可能使用同步对象(如AutoResetEvent)来协调线程之间的关系


这里的关键点是,如果您接受一个顺序任务并将其拆分为多个线程,但是线程使用锁或同步对象来序列化其执行,那么使用多个线程没有任何好处。操作仍然是连续的。

我不确定是否完全理解了这个问题,但如果您的要求只是想在
XmlResetfn
至少执行一次之前阻止
SimulnProgress
的主体执行,您可以执行:

public readonly object lockThis = new object();
private readonly ManualResetEvent resetHandle = new ManualResetEvent(false);

private void SimulnProgress()
{
    resetHandle.WaitOne();

    lock (lockThis)
    {
        UIControlHandler.Instance.ShowSimulationProgress();
    }
}

private void XmlResetFn()
{
    lock (lockThis)
    {
        DataStoreSingleTon.Instance.GetFPBConfigurationInstance().ResetXmlAfterCollision();
    }

    resetHandle.Set();
}

我不确定我是否完全理解这个问题,但如果您的要求只是想在
XmlResetfn
至少执行一次之前阻止
SimulnProgress
的主体执行,您可以执行:

public readonly object lockThis = new object();
private readonly ManualResetEvent resetHandle = new ManualResetEvent(false);

private void SimulnProgress()
{
    resetHandle.WaitOne();

    lock (lockThis)
    {
        UIControlHandler.Instance.ShowSimulationProgress();
    }
}

private void XmlResetFn()
{
    lock (lockThis)
    {
        DataStoreSingleTon.Instance.GetFPBConfigurationInstance().ResetXmlAfterCollision();
    }

    resetHandle.Set();
}

请把你的代码格式化好一点,很难理解。你可能需要重新设计一下应用程序。引发了什么异常?请更好地格式化你的代码,很难理解。您可能需要重新设计应用程序。引发了什么异常?