2014-03-06 54 views
0

我有一個名爲全局變量: string tweet;通知多個背景工人屬性更改C#

我跑幾背景的工人,什麼也不做,但等待在tweet變量的值的變化。然後運行一個調用的函數:ProcessTweet(object sender, MyCustomEventArgs args)

我的問題是什麼是從所有這些背景職工辦理屬性更改事件,後來處理基於鳴叫值並傳遞給ProcessTweet功能的其他參數的結果的最佳方式。

我試圖看看INotifyPropertyChanged,但我不知道如何處理來自每個後臺工作人員的OnValueChange事件。它會一次運行相同的ProcessTweet函數嗎,還是每個後臺工作者都會運行該函數的一個實例?

編輯:

private ITweet _LastTweet; 
public ITweet LastTweet 
{ 
    get { return this._LastTweet; } 
    set 
    { 
     this._LastTweet = value;  
    } 
} 

仍然不知道如何處理屬性更改事件的最好辦法^

並在下面的代碼

private void bgworker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     MyCustomClass myCustomClass = e.Argument as MyCustomClass; 
     //here I want to listen on the LastTweet Value Change event and handle it 
    } 

    List<BackgroundWorker> listOfBGWorkers = new List<BackgroundWorker>(); 
    private BackgroundWorker CreateBackgroundWorker() 
    { 
     BackgroundWorker bgworker = new BackgroundWorker(); 
     //add the DoWork etc.. 
     bgworker.DoWork += new System.ComponentModel.DoWorkEventHandler(bgworker_DoWork); 

     return bgworker; 
    } 

    private void buttonStart_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      //Create the background workers 
      var bgworker = CreateBackgroundWorker(); 
      listOfBGWorkers.Add(bgworker); 
      //get the MYCustomClass value; 
      var myCustomClass = SomeFunction(); 
      bgworker.RunWorkerAsync(myCustomClass); 

     } 


    } 
+0

我們可以看到一些代碼嗎?它會幫助你弄清楚你想要做什麼。 – Baldrick

+0

@Baldrick我添加了更多的代碼。謝謝參觀! – circler

+0

您是否希望*所有*您的線程回覆*設置的任何*新推文? – Baldrick

回答

1

確定的其餘的 - 這裏有一個小控制檯應用程序,它演示了我想要做的認爲

  1. 它在線程中創建「推文來源」。
  2. 您可以訂閱此「來源」,並在新的推文「抵達」時收到通知。
  3. 創建具有鳴叫的內部隊列處理
  4. 您訂閱這些TweetHandlers到源
  5. 當一個新的鳴叫到達時,由事件訂閱
  6. 添加到 隊列所有的TweetHandlers TweetHandlers
  7. TweetHandlers設置爲在自己的任務中運行。每個TweetHandler都有自己的代表,用於在Tweet上執行可定製的操作。

的代碼如下:

interface ITweet 
{ 
    object someData { get; } 
} 

class Tweet : ITweet 
{ 
    public object someData { get; set; } 
} 

class TweetSource 
{ 
    public event Action<ITweet> NewTweetEvent = delegate { }; 

    private Task tweetSourceTask; 

    public void Start() 
    { 
     tweetSourceTask = new TaskFactory().StartNew(createTweetsForever); 
    } 

    private void createTweetsForever() 
    { 
     while (true) 
     { 
      Thread.Sleep(1000); 
      var tweet = new Tweet{ someData = Guid.NewGuid().ToString() }; 
      NewTweetEvent(tweet); 
     } 
    } 
} 

class TweetHandler 
{ 
    public TweetHandler(Action<ITweet> handleTweet) 
    { 
     HandleTweet = handleTweet; 
    } 

    public void AddTweetToQueue(ITweet tweet) 
    { 
     queueOfTweets.Add(tweet); 
    } 

    public void HandleTweets(CancellationToken token) 
    { 
     ITweet item; 
     while (queueOfTweets.TryTake(out item, -1, token)) 
     { 
      HandleTweet(item); 
     } 
    } 

    private BlockingCollection<ITweet> queueOfTweets = new BlockingCollection<ITweet>(); 
    private Action<ITweet> HandleTweet; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var handler1 = new TweetHandler(TweetHandleMethod1); 
     var handler2 = new TweetHandler(TweetHandleMethod2); 

     var source = new TweetSource(); 
     source.NewTweetEvent += handler1.AddTweetToQueue; 
     source.NewTweetEvent += handler2.AddTweetToQueue; 

     // start up the task threads (2 of them)! 
     var tokenSource = new CancellationTokenSource(); 
     var token = tokenSource.Token; 
     var taskFactory = new TaskFactory(token); 
     var task1 = taskFactory.StartNew(() => handler1.HandleTweets(token)); 
     var task2 = taskFactory.StartNew(() => handler2.HandleTweets(token)); 

     // fire up the source 
     source.Start(); 

     Thread.Sleep(10000); 
     tokenSource.Cancel(); 
    } 

    static void TweetHandleMethod1(ITweet tweet) 
    { 
     Console.WriteLine("Did action 1 on tweet {0}", tweet.someData); 
    } 

    static void TweetHandleMethod2(ITweet tweet) 
    { 
     Console.WriteLine("Did action 2 on tweet {0}", tweet.someData); 
    } 
} 

輸出看起來是這樣的:

Did action 2 on tweet 892dd6c1-392c-4dad-8708-ca8c6e180907 
Did action 1 on tweet 892dd6c1-392c-4dad-8708-ca8c6e180907 
Did action 2 on tweet 8bf97417-5511-4301-86db-3ff561d53f49 
Did action 1 on tweet 8bf97417-5511-4301-86db-3ff561d53f49 
Did action 2 on tweet 9c902b1f-cfab-4839-8bb0-cc21dfa301d5