Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用属性更改通知多个后台工作人员C#_C#_.net_Events_Event Handling_Backgroundworker - Fatal编程技术网

用属性更改通知多个后台工作人员C#

用属性更改通知多个后台工作人员C#,c#,.net,events,event-handling,backgroundworker,C#,.net,Events,Event Handling,Backgroundworker,我有一个全局变量,名为: 字符串tweet 我运行了几个后台工作程序,只等待tweet变量的值更改。然后运行一个名为:ProcessTweet(对象发送者,MyCustomEventArgs args args) 我的问题是,处理所有后台工作人员的属性更改事件,然后根据tweet值和传递给ProcessTweet函数的另一个参数处理结果的最佳方法是什么 我试图查看INotifyPropertyChanged,但我不确定如何处理来自每个后台工作程序的OnValueChange事件。它将运行相同的P

我有一个全局变量,名为:
字符串tweet

我运行了几个后台工作程序,只等待
tweet
变量的值更改。然后运行一个名为:
ProcessTweet(对象发送者,MyCustomEventArgs args args)

我的问题是,处理所有后台工作人员的属性更改事件,然后根据tweet值和传递给
ProcessTweet
函数的另一个参数处理结果的最佳方法是什么

我试图查看
INotifyPropertyChanged
,但我不确定如何处理来自每个后台工作程序的
OnValueChange
事件。它将运行相同的
ProcessTweet
函数一次,还是每个后台工作人员将运行该函数的一个实例

编辑:

仍然不确定如何以最佳方式处理属性更改事件^

下面是代码的其余部分

    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);

        }


    }
private void bgworker\u DoWork(对象发送方,DoWorkEventArgs e)
{
MyCustomClass MyCustomClass=e。参数为MyCustomClass;
//这里我想听听LastTweet值更改事件并处理它
}
List listOfBGWorkers=新列表();
私有BackgroundWorker CreateBackgroundWorker()
{
BackgroundWorker bgworker=新的BackgroundWorker();
//添加销钉等。。
bgworker.DoWork+=新系统.ComponentModel.DoWorkEventHandler(bgworker\u DoWork);
返回工作人员;
}
私有无效按钮开始单击(对象发送者,事件参数e)
{
对于(int i=0;i<10;i++)
{
//创建后台工作人员
var bgworker=CreateBackgroundWorker();
添加(bgworker);
//获取MYCustomClass值;
var myCustomClass=SomeFunction();
bgworker.RunWorkerAsync(myCustomClass);
}
}

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

  • 它在一个线程中创建一个“tweets源”
  • 您可以订阅此“源”,并在新tweet“到达”时收到通知
  • 您创建的TweetHandler具有要处理的内部tweet队列
  • 您将这些TweetHandler订阅到源
  • 当新tweet到达时,事件订阅会将其添加到所有tweetHandler的队列中
  • TweetHandler设置为在自己的任务中运行。每个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);
        }
    }
    

    我们能看一些代码吗?这将有助于找出您想要做的事情。@Baldrick我添加了更多的代码。谢谢你看!你想让你所有的线程都响应任何新设置的tweet吗?是的,但是每个线程都应该得到一个不同的myCustomTask变量。这感觉可能是一个X-Y问题。你想达到什么目标?为什么需要多个线程同时处理同一条推文?
    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