我有一个问题。在一个表单中,我在一个单独的类的线程中调用函数:
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”中的“mainfunction”在同一个类的函数上生成一个附加线程。
现在这个子线程应该访问同一类的父线程“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
}
}
提前致谢。
干杯
答案 0 :(得分:1)
尝试使用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
答案 1 :(得分:0)
通常,您不需要让另一个线程执行某些代码,您只需要使用锁来暂停其他线程。在这种情况下,为什么要在线程A中执行代码会很有趣。(Winforms只需要在其他线程中运行代码,因为它可以使用COM-Components,它根本不能很好地处理多线程。)< / p>
使用你的线程A,这是不可能的,因为当执行到达main方法的末尾时它已经死了。
Windows窗体使用“Dispatcher”概念:有一个主循环,它在程序关闭之前运行,并在通过Control.Invoke插入时在其线程中执行工作包。您可以在mainfunction()的末尾添加这样一个几乎无限循环,从List执行Action-Delegates(https://msdn.microsoft.com/en-us/library/system.action(v=vs.110).aspx) - 使用ConcurrentList或者在插入/时不要忘记锁定(例如列表)删除元素。
您还可以尝试使用预定义的Dispatcher:https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspx
但也许,在这种情况下,没有切换线程的另一种解决方案可能会更好。