Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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
不同线程中同一类的父线程中的C#调用方法_C#_.net_Multithreading_Delegates_Invoke - Fatal编程技术网

不同线程中同一类的父线程中的C#调用方法

不同线程中同一类的父线程中的C#调用方法,c#,.net,multithreading,delegates,invoke,C#,.net,Multithreading,Delegates,Invoke,我有个问题。以一种形式,我从一个单独的类中调用了线程中的函数: public partial class mainForm : Form { private void button_Click(object sender, EventArgs e) { myclass myc = new myclass(); Thread mythread = new Thread(myc.mainfunction); mythread.name ="A";

我有个问题。以一种形式,我从一个单独的类中调用了线程中的函数:

public partial class mainForm : Form
{
  private void button_Click(object sender, EventArgs e)
  {          
    myclass myc = new myclass();
    Thread mythread = new Thread(myc.mainfunction);
    mythread.name ="A";
    mythread.Start();
  } 
}
在该函数中,线程“A”中的“mainformation”是在同一类的函数上生成的附加线程

现在,该子线程应该访问同一类的父线程“a”的函数

我知道如何使用窗体中的委托访问控件。但在这种情况下不是这样。谁能帮我一下吗

class myclass
{

    public void mainfunction ()
    {
      ...
      myclass submc = new myclass();
      Thread subthread = new Thread(new ParameterizedThreadStart(submc.subfunction));
      mythread.name ="B";
      subthread.Start(this);
    }

    public void subfunction(object parm)
    {
      myclass parentc = (myclass)parm;
      parentc.doanything()

    }

    public void doanything()
    {
     ...
     // this should happen in Thread A NOT B
    }



}
提前谢谢


干杯

通常,您不需要让其他线程执行某些代码,您只需要使用锁暂停其他线程。在本例中,您希望在线程A中执行代码的原因很有意思。(Winforms只需要在其他线程中运行代码,因为它可以使用COM组件,而COM组件根本不能很好地处理多线程。)

对于线程A,这是不可能的,因为当执行到达主方法的末尾时,它可能已经死亡

Windows窗体使用“Dispatcher”概念:有一个主循环,在程序关闭前运行,并在通过Control.Invoke插入工作包时在其线程中执行工作包。您也可以在main function()的末尾添加这样一个几乎无休止的循环,从列表中执行操作委托()——使用ConcurrentList或在插入/删除元素时不要忘记锁定(例如列表)

您还可以尝试使用预定义的调度程序:


但是,在这种情况下,另一种不切换线程的解决方案可能会更好。

尝试使用System.Reactive中的EventLoopScheduler。 例如:

class Program
{
    static void Main(string[] args)
    {
        var scheduler = new EventLoopScheduler(); // will manage thread A
        WriteThreadName();
        scheduler.Schedule(WriteThreadName);
        scheduler.Schedule(() =>
        {
            // inside thread A we create thread B
            new Thread(() =>
            {
                WriteThreadName();
                scheduler.Schedule(WriteThreadName); // schedule method on thread A from thread B
            }).Start();
        });

        Console.ReadLine();

    }

    static void WriteThreadName()
    {
        Console.WriteLine("Thread: "+Thread.CurrentThread.ManagedThreadId);
    }
}
这张照片

Thread: 9
Thread: 11
Thread: 12
Thread: 11

线程A将不再存在。它已完成运行并终止。为什么你需要在那个特定的线程上运行一些东西呢?看起来很好,哦,是的。不知何故,我没有得到它。线程已完成。。。所以原因是“doanything()”方法中的tableadapter更新。我有时会遇到System.Data.OleDb.OLEDBEException,不知道为什么会发生这种情况。希望将表上的更新合并到一个线程中。