C#-Threads和父母传递给孩子
我只是想知道有关父母传递给孩子的问题,如果这样做,等等,以便孩子可以从父母访问功能,在这种情况下,它涉及到线程。我的情况如下:基于C#-Threads和父母传递给孩子
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类它已完成,重置定时器并返回到睡眠状态直到定时器再次耗尽,否则我该怎么做?
〜问候,
海因里希
处理你正在做的事情的另一种方式是让B提出一个事件并让A处理事件。这样你就不必将A传递给B.我不知道你的真实结构是什么,但可以说B的线程函数做了更复杂的事情,A实现了IDisposable
。如果A在B达到它正在调用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
处置,我只是懒得做的一切,示例代码,只是想给大家介绍使用事件信号的工作是一个想法完成。
看代码,你似乎没有任何线程的问题。如果您正在处理相同的变量,则可能会引入竞争条件,但这对于您提出的情况并不特别。
你会像对待任何其他多线程情况和锁定可能被多个线程访问的资源。
我建议以下的在线图书:http://www.albahari.com/threading/
我不认为你真的要他们尽可能紧你是连接,你正在尝试做的是简单地传递信息或线程之间的状态。所以我建议不让他们紧密连接的原因是为了减少耦合。
我引用的网站包含许多不同的信令技术。选择最简单的您的需求。我需要更多关于您的具体要求的细节来为您挑选一个。
+1用于推荐albahari线程站点。这是例外! – pstrjds 2011-06-09 05:15:09
如果B有一个计时器,为什么A需要一个线程? – Amy 2011-06-09 04:33:23
因为它们在做什么时是分开的,所以A必须启动B,然后返回并完成与B分离的一组不同的任务,如果想像这样看待它,A有自己的计时器,它可以运行并且独立于B,在B有效时,A必须可以自由地执行其他功能 – Heinrich 2011-06-09 04:41:13