我只是想知道将父母传递给孩子的问题,如果这样做,等等,以便孩子可以从父母访问功能,在这种情况下它涉及线程。我的方案如下:
public class A
{
public A()
{
B b = new B(this);
Thread thread = new Thread(new ThreadStart(b.GO));
}
public string DoSomething() { return "Something Done"; }
}
public class B
{
A _a;
public B(A a)
{
_a = a;
}
public void GO() { _a.DoSomething(); }
}
基于上面我想知道发生的任何约定冲突,或者当你做这样的事情时生效的问题,这样做是不是很糟糕?我知道肯定会出现一些线程安全问题。但是我的整体问题可以做到这一点,它是否会带来一些其他问题?我如何更新主线程中的值? 我想要它分开的原因是因为B类中有一个计时器(不是在显示的代码中),当它用完时会做一些事情,然后告诉A类它已经完成,重置计时器并返回睡眠直到计时器再次耗尽,我怎么办呢?
〜问候,
海因里希
答案 0 :(得分:3)
查看代码,您似乎没有任何线程问题。如果您正在处理相同的变量,则可能会引入竞争条件,但这对您建议的情况并不特殊。
您可以将此视为任何其他多线程情况,并锁定多个线程可能访问的资源。
我会推荐以下在线图书:http://www.albahari.com/threading/
我认为你不必像现在这样紧密地连接它们,你要做的只是在线程之间传递消息或状态。所以我建议不要让它们紧密连接的原因是减少耦合。
我引用的网站包含许多不同的信令技术。选择最简单的满足您的需求。我需要更多有关您的确切要求的详细信息,以便为您选择一个。
答案 1 :(得分:1)
处理你正在做的事情的另一种方法是B举起一个事件,让A来处理这个事件。这样你就不必将A传递给B.我不知道你的真实结构是什么,但是我们可以说B的线程函数做了更复杂的事情并且A实现了IDisposable
。如果在B到达它在A上调用方法之前处理A会发生什么。对我来说,处理这种情况的更简洁的方法是让B引发一个事件和A寄存器。
public class A
{
B _b;
public A()
{
_b = new B();
_b.DidSomething += HandleDidSomething;
}
private void HandleDidSomething(object source, EventArgs e)
{
// Handle the B did something case
}
public void WaitForBToFinish() { _b.DoneDoingThings.WaitOne(); }
}
public class B
{
Event EventHandler DidSomething;
ManualResetEvent DoneDoingThings = new ManualResetEvent(false);
public B() {}
public void StartDoingThings()
{
new Thread(DoThings).Start();
}
private void DoThings()
{
for (int i=0; i < 10; i++)
{
Thread.Sleep(1000);
OnDidSomething(new EventArgs());
}
DoneDoingThings.Set();
}
private void OnDidSomething(EventArgs e)
{
if (DidSomething != null)
{
DidSomething(e);
}
}
}
注意 - 您应该在B类中实现IDisposable并处理ManualResetEvent
,我只是懒得为示例代码做所有这些,并且只是想让您了解如何使用事件来表示工作是完成。