Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从类B[C#]中的线程调用类a中的函数_C# - Fatal编程技术网

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

从类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() {

现在所有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 ...
        }
    }
};
有人对我如何以线程安全的方式完成这项任务有什么建议吗? 任何帮助都将不胜感激。
谢谢,

与前面的问题一样,您必须将要调用方法的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锁定。