2011-06-09 132 views
1

我只是想知道有关父母传递给孩子的问题,如果这样做,等等,以便孩子可以从父母访问功能,在这种情况下,它涉及到线程。我的情况如下:基于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类它已完成,重置定时器并返回到睡眠状态直到定时器再次耗尽,否则我该怎么做?

〜问候,

海因里希

+0

如果B有一个计时器,为什么A需要一个线程? – Amy 2011-06-09 04:33:23

+0

因为它们在做什么时是分开的,所以A必须启动B,然后返回并完成与B分离的一组不同的任务,如果想像这样看待它,A有自己的计时器,它可以运行并且独立于B,在B有效时,A必须可以自由地执行其他功能 – Heinrich 2011-06-09 04:41:13

回答

1

处理你正在做的事情的另一种方式是让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处置,我只是懒得做的一切,示例代码,只是想给大家介绍使用事件信号的工作是一个想法完成。

3

看代码,你似乎没有任何线程的问题。如果您正在处理相同的变量,则可能会引入竞争条件,但这对于您提出的情况并不特别。

你会像对待任何其他多线程情况和锁定可能被多个线程访问的资源。

我建议以下的在线图书:http://www.albahari.com/threading/

我不认为你真的要他们尽可能紧你是连接,你正在尝试做的是简单地传递信息或线程之间的状态。所以我建议不让他们紧密连接的原因是为了减少耦合。

我引用的网站包含许多不同的信令技术。选择最简单的您的需求。我需要更多关于您的具体要求的细节来为您挑选一个。

+0

+1用于推荐albahari线程站点。这是例外! – pstrjds 2011-06-09 05:15:09