【问题标题】:Notify multiple background workers with a property change C#通过属性更改 C# 通知多个后台工作人员
【发布时间】:2014-03-06 08:29:24
【问题描述】:

我有一个名为的全局变量: string tweet;

我运行了几个后台工作程序,除了等待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);

        }


    }

【问题讨论】:

  • 我们可以看一些代码吗?这对弄清楚你要做什么很有帮助。
  • @Baldrick 我添加了更多代码。感谢您的观看!
  • 你想让你的 all 线程响应 any 设置的新推文吗?
  • 是的,但是每个线程应该得到一个不同的 MyCustomTask 变量
  • 这感觉可能是 X-Y 问题。你想达到什么目的?为什么需要多个线程同时处理同一个推文?

标签: c# .net events event-handling backgroundworker


【解决方案1】:

好的 - 这是一个小型控制台应用程序,它演示了我认为您正在尝试做的事情。

  1. 它在线程中创建一个“推文来源”。
  2. 您可以订阅此“来源”,并在新推文“到达”时收到通知。
  3. 您创建 TweetHandlers,其中包含要处理的内部推文队列
  4. 您将这些 TweetHandler 订阅到源代码
  5. 当一条新推文到达时,它被事件订阅添加到所有个TweetHandler的队列中
  6. TweetHandler 设置为在它们自己的任务中运行。每个 TweetHandler 都有自己的委托,用于对推文执行可自定义的操作。

代码如下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    相关资源
    最近更新 更多