none
有關非同步的問題 RRS feed

  • 一般討論

  • 請問一下,小弟有一個需求

    UI1 去 call method取得資料,但該method是用非同步的方式去遠端取得資料

    接下來該method還沒取得完資料的時後

    UI2對該method取得的資料也有興趣,希望該method取得完資料時,可以通知它

    如果中間有UI3、4、5也有興趣的話,也可以讓這個method取完資料通知他們

    請問各位大大,有什麼solution可以完成這個task嗎?

    2012年10月5日 上午 07:13

所有回覆

  • 好像是要一開始就加入那個method的Delegate吧!

    不然就要在UI1取得資料後去notify他們。


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年10月5日 上午 07:22
  • 感謝亂馬客

    1、如果該method已經在執行中了,我要如何再那個medhod再加入Delegate?

    2、第二個方法我就不清楚了?是否可以再給具體的說明或是有任何document可以參考嗎?感謝

    2012年10月5日 上午 08:33
  • 第二個方法可以利用delegate或event來發出通知
    2012年10月5日 上午 08:45
  • Sorry…小弟愚笨,可有sample code可以參考呢?
    2012年10月5日 上午 09:31
  • 您好,
    請參考一下: [C#.NET] 如何 使用 委派 Delegate / 事件 event

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年10月5日 上午 10:01
  • 可以用事件架構非同步模型, 參考 MSDN 使用事件架構非同步模式設計多執行緒程式

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年10月5日 上午 11:43
    版主
  • 或許你可以參考一下 Observer Pattern, 我覺得這個樣式似乎蠻符合你的需求。

    原則上, 你可以動態地把 Observer (觀察者) 加入或移除於某個事件或其處理函式。當這個方法被觸發後 (不管是否非同步), 讓它在完成時通知所有已訂閱這個事件的各個觀察者物件。你可以參考我寫的「觀察者樣式之應用」, 裡面有一部教學影片的連結和範例程式。


    2012年10月6日 下午 08:14
  • 2012年10月7日 上午 09:25

  • 你的意思是:呼叫非同步的函式來取資料,然後執行期間好幾個UI一起呼叫的時候只執行一次嗎?

    如果是這種需求的話,
    因為非同步執行的函式,結束的時候會有通知的機制,利用這點。

    1.UI01在呼叫函式的時候,先去檢查是否函式正在執行。
    2.沒有執行就開始執行,並且把UI01加入結束通知清單。
    3.UI02呼叫函式的時候,發現函式正在執行
    4.不執行,直接把UI02加入結束通知清單。
    5.函式執行完畢的通知機制,通知清單內的所有UI。

    學無止境

    2012年10月11日 上午 01:42
  • 感覺上,這個問題偏向事件訂閱機制比較多。如果是這樣,假設你那個取資料的 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. 這裡的範例沒有考慮非同步呼叫的處理細節)

    2012年10月12日 上午 01:42
  • 請問你這問題還有後續嗎 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年10月18日 上午 06:40
    版主