提問者
有關非同步的問題

一般討論
-
請問一下,小弟有一個需求
UI1 去 call method取得資料,但該method是用非同步的方式去遠端取得資料
接下來該method還沒取得完資料的時後
UI2對該method取得的資料也有興趣,希望該method取得完資料時,可以通知它
如果中間有UI3、4、5也有興趣的話,也可以讓這個method取完資料通知他們
請問各位大大,有什麼solution可以完成這個task嗎?
- 已變更類型 Bill ChungMVP, Moderator 2012年11月10日 上午 08:56 發問者未繼續回覆, 因此石沉大海
所有回覆
-
好像是要一開始就加入那個method的Delegate吧!
不然就要在UI1取得資料後去notify他們。
以上說明若有錯誤請指教,謝謝。
亂馬客blog: http://www.dotblogs.com.tw/rainmaker/ -
您好,
請參考一下: [C#.NET] 如何 使用 委派 Delegate / 事件 event以上說明若有錯誤請指教,謝謝。
亂馬客blog: http://www.dotblogs.com.tw/rainmaker/ -
可以用事件架構非同步模型, 參考 MSDN 使用事件架構非同步模式設計多執行緒程式
在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
-
或許你可以參考一下 Observer Pattern, 我覺得這個樣式似乎蠻符合你的需求。
原則上, 你可以動態地把 Observer (觀察者) 加入或移除於某個事件或其處理函式。當這個方法被觸發後 (不管是否非同步), 讓它在完成時通知所有已訂閱這個事件的各個觀察者物件。你可以參考我寫的「觀察者樣式之應用」, 裡面有一部教學影片的連結和範例程式。
-
-
感覺上,這個問題偏向事件訂閱機制比較多。如果是這樣,假設你那個取資料的 method 叫做 GetData(),你也許是把它放在一個類別裡面,假設叫做 MyWorker。底下是該類別的假想實作(真的可以跑):
public class MyWorker { private static MyWorker _myWorker; public event Action<string> DataFetched; private MyWorker() { } public static MyWorker Instance { get { if (_myWorker == null) { _myWorker = new MyWorker(); } return _myWorker; } } public void GetData() { // async call to another method to get data. // wait for async result. System.Threading.Thread.Sleep(1000); string data = DateTime.Now.ToString(); if (DataFetched != null) { DataFetched(data); } } }
此類別有個公開事件可供外界訂閱: DataFetched。
你的 UI1, 2, 3... 就是訂閱者,也許類似這樣:
private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); MyWorker.Instance.DataFetched += form2.DataFetchedHandler;
Form3 form3 = new Form3(); MyWorker.Instance.DataFetched += form3.DataFetchedHandler;
form2.Show(); form3.Show(); }真正要抓取資料時:
private void button2_Click(object sender, EventArgs e) { MyWorker.Instance.GetData(); }
於是取完資料時,MyWorker 會主動通知 form2 和 form3(呼叫他們的 DataFetchedHandler 方法)。
大概是類似這樣的概念吧。(P.S. 這裡的範例沒有考慮非同步呼叫的處理細節)