2013-07-31 92 views
0

我想等待GetValues.Get方法並同步返回值給調用者。 ServerDataProvider,BookDataFetcher類是mycode外部的,我無法控制它。 任何幫助如何實現這一點非常感謝。線程之間的回調同步

namespace Test { 
class Program 
{ 
    static void Main(string[] args) 
    { 
     GetValues val = new GetValues(); 
     val.Get("BOOKS", DataHandler); 
     Console.ReadKey(); 
    } 

    static void DataHandler(IList<string> values) { 
    } 
} 

class GetValues 
{ 
    public delegate void DataHandler(IList<string> values); 
    public event DataHandler OnReceiveDataHandler; 

    public void Get(string colName, DataHandler handler) 
    { 
     OnReceiveDataHandler += handler; 
     GetDataFromServer svr = new GetDataFromServer(); 
     svr.OnReceiveDataHandler += OnReceiveData; 
     svr.GetData(colName); 
    } 

    // Callback Handler 
    private void OnReceiveData(IList<string> values) { 
     OnReceiveDataHandler(values); 
    } 
} 

class GetDataFromServer 
{ 
    internal delegate void DataHandler(IList<string> values); 
    internal event DataHandler OnReceiveDataHandler; 

    internal void GetData(string columnName) 
    { 
     ServerDataProvider datafetcher = new ServerDataProvider(); 
     datafetcher.OnReceiveDataHandler += OnReceiveData; 
     Task.Factory.StartNew(() => datafetcher.GetDataFromServer(columnName)); 
    } 

    // Callback Handler 
    private void OnReceiveData(IList <string> values) { 
     OnReceiveDataHandler(values); 
    } 
} 

class ServerDataProvider 
{ 
    internal delegate void DataHandler(IList<string> values); 
    internal event DataHandler OnReceiveDataHandler; 

    public void GetDataFromServer(string columnName) 
    { 
     BookDataFetcher b = new BookDataFetcher(); 
     b.OnReceiveDataHandler += OnReceiveData; 
     Task.Factory.StartNew(() => b.GetBookData(columnName)); 
    } 

    // Calback Handler 
    private void OnReceiveData(IList<string> values) 
    { 
     OnReceiveDataHandler(values); 
    } 
} 

class BookDataFetcher 
{ 
    internal delegate void DataHandler(IList<string> values); 
    internal event DataHandler OnReceiveDataHandler; 

    public void GetBookData(string col) 
    { 
     Thread.Sleep(5000); 
     OnReceiveDataHandler(new List<string> {"Book1", "Book2"}); 
    } 
} 

}

+0

您是否嘗試過使用TPL爲實現? – vittore

+1

在這種情況下包括你的代碼將會很有幫助。 –

+0

而你想在不改變'Method-B'的代碼的情況下做到這一點? –

回答