【问题标题】:Notification on Property Change C#属性更改通知 C#
【发布时间】:2014-04-19 13:35:51
【问题描述】:

您好,我有一个包含许多后台工作人员的程序。这些后台工作人员除了监听名为“tweet”的变量的变化之外什么也不做,然后每个后台程序为每个“tweet”创建一个任务来处理它并准备好处理另一个 Tweet。

以下是每 1 秒或更短时间更新一次的 Tweet 类。

  Tweet tweet = new Tweet();
    public class Tweet : INotifyPropertyChanged
    {
        private ITweet lastTweet;

        protected void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
                handler(this, e);
        }

        protected void OnPropertyChanged(string propertyName)
        {
            OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
        }

        public ITweet LastTweet
        {
            get { return lastTweet; }
            set
            {
                if (value != lastTweet)
                {
                    lastTweet = value;
                    OnPropertyChanged("LastTweet");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

现在在我的 BackgroundWorker DoWork 实现中:

        Del OnNewTweetEvent = delegate(object sender2, PropertyChangedEventArgs args)
        {
            Task task = null;
            task = new Task(() =>
            {
                var mytweet = sender2 as Tweet;
                var tweetText = mytweet.LastTweet.Text;
                //copy the tweetText in case the mytweet variable changed ( not sure )
                ProcessTweet( tweetText );
            });
            task.Start();

        };
        this.tweet.PropertyChanged += new PropertyChangedEventHandler(OnNewTweetEvent);

        //wait and prepare for cancellation
        var backgroundworker = sender as BackgroundWorker;
        while (true)
        {
            Thread.Sleep(10);
            if (backgroundworker.CancellationPending)
            {
                //remove the notification
                this.tweet.PropertyChanged -= new PropertyChangedEventHandler(OnNewTweetEvent);
                return;
            }
        }
    }

这个代码逻辑对吗?如果推文源推文每 0.01 秒发布一次,我能全部获取吗?或者推文可能会在我的后台工作人员没有得到的情况下发生变化?

排队更好吗? 感谢您的帮助。

【问题讨论】:

    标签: c# .net multithreading twitter queue


    【解决方案1】:

    正如您已经怀疑的那样,您的示例中的方法可能无法捕获每条推文或保证每条推文只处理一次。因此,您应该将它们存储在一个集合中。队列将非常适合此目的。

    更直接的方法是让一个后台任务监视队列并启动一个异步任务来处理队列中的新推文。

    但是,有人需要将推文放入队列中(或者在您的示例中更新 Tweet 对象的属性)。因此,最简单和最好的方法是在新推文到达时立即启动异步任务。这消除了等待新推文的后台任务,从而消除了系统可能中断的地方。

    根据您的代码示例,以下代码显示了一种在新推文到达时立即处理它的简单方法。您可能希望将代码移动到代码中的另一个位置,并根据需要重命名类型。根据您的 cmets,此示例还考虑了针对不同推文类型的不同操作:

    // No need to implement INotifyPropertyChanged as there is no listener anymore
    public class Tweet 
    {
        private ITweet lastTweet;
    
        public ITweet LastTweet
        {
            get { return lastTweet; }
            set
            {
                if (value != lastTweet)
                {
                    lastTweet = value;
                    var actionForTweet = GetActionForTweet(lastTweet);
                    Task task = new Task(() =>
                    {
                        actionForTweet(lastTweet);
                    });
                    task.Start();
                }
            }
        }
    
        private static Action<ITweet> GetActionForTweet(ITweet tweet)
        {
            // Decide what to do for which kind of tweet
            // In the simplest case this is an if/switch statement
            if ( ... )
                  return x => {
                                  var tweetText = x.Text;
                                  ProcessTweet( tweetText );
                              };
            else 
                  return x => {
                                  // Do something else
                              };
        }
    }
    

    【讨论】:

    • 感谢您的回复。您能否以最佳方式对我当前的代码进行一些代码编辑?
    • @circler:我添加了一个小样本。希望对您有所帮助。
    • 感谢您的代码。将它作为一个集合来做的最好方法是什么,因为我想在后台工作人员中运行它,因为每个工作人员都有不同的事情要做。
    • @circler:我已经更新了样本,能够为不同的推文做不同的事情。我认为你不需要排队。我对您的项目了解不多,所以请不要指望一个无需修改或采用就适合您的特定环境的示例。尽管如此,希望我的想法有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2017-05-21
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多