场景如下:
public class MainClass
{
private static Object common_object;
protected int Method_A()
{
...
lock (common_object)
{
// Works with common_object;
...
}
...
// Invokes another's thread Method_B
}
protected int Method_B()
{
...
}
}
我有一个类:“主类”,以及它的2个(或更多)实例。
Class有一个对象(私有,静态),它由每个实例共享,并在需要时使用“lock(){...}”进行保护。我没有遇到任何问题。
班级还有两种方法,这些方法让我变得疯狂,试图让一切运转起来。
假设有一个“主要方法/功能”,A,它是从外部调用的(我无法控制这个调用,也不知道何时会发生,但几乎所有的时间都非常短暂两个线程上一个invokation和下一个invokation之间的空格。
还有第二种方法B,更短(在执行时和代码中)。
问题在于:
t2调用方法A
t1调用方法A
t2(来自方法A)调用t1的方法B
t1和t2被阻止。
从另一个线程(t1)的方法A调用一个线程(t2)的方法B,如果在t2执行方法A时完成,则一切都以这种或那种方式崩溃。通常两个线程都被阻止。
我正在使用一个标志变量,所以当t2开始执行方法A时,t1使用这个标志知道他不能调用t2的方法B,直到t2完成方法A执行,但似乎我'我错过了一些东西,因为它不起作用。
我习惯使用Java,而且我觉得C#代码存在完全相同的逻辑,我认为c#中必须有一些函数或“技巧”我缺少。
我想(并且希望)必须有一个简单的方法来解决这个问题,因为它不是市长,所以我终于来了,在3天之后寻求帮助而我自己没有任何有意义的进展。< / p>
提前致谢。
答案 0 :(得分:0)
我觉得你在这里感到困惑。你只有一个类和一个对象。线程没有自己的方法副本。当Method_A调用Method_B时,它就在一个线程上。另外:标志使用起来非常棘手。你没有在你的例子中加一个,所以我不能具体说出你做错了什么,但我从来没有在第一次尝试时把它们弄好。 (或者第二个。)如果可以,最好避免使用它们。
在这种情况下,我认为您需要做的就是将对Object_B的调用放在common_object锁定块中。
就我看而言,你所做的一切在C#中都与在Java中一样。
答案 1 :(得分:0)
好吧,正如terrybozzio所说,它是关于将eventwaithandles方法(等待,脉冲)放在错误的地方。问题解决了。
感谢您的提示。