从类B [C#]中的线程调用A类中的函数

时间:2009-08-28 19:21:01

标签: c#

现在所有的WaitOne和ManualResetEvent工作都在工作(谢谢!)我有一个最后的问题,就是从一个属于B类的线程在A类中运行一个函数 - 再次允许我说明......

查看A类中的函数“DoIt(obejct param)”,这需要由类A(如图所示)以及类B中的线程调用(如图所示)......这怎么可能实现的呢?某种形式的代表会帮忙吗?

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 ...
        }
    }
};

任何人都有关于如何以线程安全的方式完成此任务的任何建议? 任何帮助将非常感激。 谢谢,

3 个答案:

答案 0 :(得分:1)

鉴于您当前的设计,最简单的方法是将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标记为公开。

答案 1 :(得分:0)

与上一个问题一样,您必须将要调用方法的A实例传递给B的构造函数。

答案 2 :(得分:0)

我假设必须有一些更高级的类来操纵A类和B类?如GUI表格还是主线程?

您可以为B类定义一个在应该完成工作时触发的事件。让你的表单听取这个事件,并在它调用A类函数时。

听起来好像你的两个班级高度依赖彼此。如果B中的工作取决于A中的结果,反之亦然,您可能需要重新考虑您的类实际上是如何模块化的。