从类B[C#]中的线程调用类a中的函数
现在所有WaitOne和ManualResetEvent的东西都在工作(谢谢!)我还有最后一个问题,那就是从属于类B的线程运行类a中的函数-再次让我来说明 看看类A中的函数“DoIt(obejct param)”,它需要由类A(如图所示)以及类B中的线程(如图所示)调用。。。如何做到这一点?某种形式的代表会有所帮助吗从类B[C#]中的线程调用类a中的函数,c#,C#,现在所有WaitOne和ManualResetEvent的东西都在工作(谢谢!)我还有最后一个问题,那就是从属于类B的线程运行类a中的函数-再次让我来说明 看看类A中的函数“DoIt(obejct param)”,它需要由类A(如图所示)以及类B中的线程(如图所示)调用。。。如何做到这一点?某种形式的代表会有所帮助吗 class A { private ManualResetEvent manualResetEvent; int counter = 0; public A() {
class A
{
private ManualResetEvent manualResetEvent;
int counter = 0;
public A()
{
manualResetEvent = new ManualResetEvent(false);
B child = new B(manualResetEvent);
if (manualResetEvent.WaitOne(1000, false))
{
... do the work I was waiting on ...
}
... do more work ...
// Call the function DoIt from within A //
DoIt(param)
}
// This is the function that needs to be called from A and thread in B
void DoIt(object param)
{
counter++;
... do something with param with is local to A ...
}
};
Class B
{
private ManualResetEvent manualResetEvent;
public B(ManualResetEvent mre)
{
manualResetEvent = mre;
Thread childThread = new Thread(new ThreadStart(Manage));
childThread.IsBackground = true;
childThread.Name = "NamedPipe Manager";
childThread.Start();
private void Manage()
{
... do some work ...
... call some functions ...
// Calling the function from Class A, obviouslly doesn't work as-is
DoIt(param);
manualResetEvent.Set();
... do more work ...
... call more functions ...
}
}
};
有人对我如何以线程安全的方式完成这项任务有什么建议吗?
任何帮助都将不胜感激。
谢谢,与前面的问题一样,您必须将要调用方法的A实例传递给B的构造函数。鉴于您当前的设计,最简单的方法是将A传递给对象B,就像您对manualresetevent所做的那样:
B child = new B(this, manualResetEvent);
... etc...
Class B
{
private A parent;
private ManualResetEvent manualResetEvent;
public B(A p, ManualResetEvent mre)
{
parent = p;
manualResetEvent = mre;
... etc ...
private void Manage()
{
... do some work ...
... call some functions ...
parent.DoIt(param);
... etc...
当然,您需要将A.DoIt标记为public。我假设一定有一个更高的类同时操作A和B类?例如GUI窗体或主线程 您可以为类B定义一个事件,该事件在应该完成工作时触发。让您的窗体侦听事件,并在事件发生时调用类A中的函数
听起来好像你的两个类彼此高度依赖。如果B中的工作取决于A中的结果,反之亦然,您可能需要重新考虑类的实际模块化程度。这是一个服务,有一个更高的类(服务接口),但没有GUI(没有控件)。只传递“This”并使用parent.manualResetEvent不是更好吗?可能吧。但是如果你关心的是好的设计,那么你可能应该重新评估整个设计,而不仅仅是一个小东西。我一直认为传递这是可怕的编码。。。希望这是byref而不是byval完成的,因为我可以有5-10个线程(类B的实例)运行。。。这被认为是线程安全的吗?如果两个子类(B类)同时调用A.DoIt(…)会怎么样?请使用一个每次只能调用1个的锁定代码。如果不知道您在工作中到底在做什么,就很难知道为什么您的代码一开始就不是线程安全的。我可以锁定一个函数吗?或者,当使用DoIt时,您的意思是锁定(父级)本身吗?传递它本身并没有什么错误。如果要访问任何共享状态(例如,的成员),则需要同步对该状态的访问。顺便说一句,锁定整个对象是不好的,您应该尽可能细化wrt锁定。