用属性更改通知多个后台工作人员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