【问题标题】:Identify Methods Assigned to DoWork [duplicate]识别分配给 DoWork 的方法 [重复]
【发布时间】:2019-01-03 23:20:06
【问题描述】:

我继承了一个使用后台工作器的应用程序。在应用程序的过程中,DoWork 分配和删除了多个功能(见下文)。是否有可以调用的属性或方法来评估当前分配给 DoWork 函数的方法,或者这是否应该由应用程序跟踪?

例如:

worker.DoWork += method1;

{ Run some code }

worker.DoWork -= method1;

worker.DoWork += method2;

{ Run some code }

worker.DoWork -= method2;

【问题讨论】:

  • 这是一个非常不稳定的代码,无法猜测为什么它的作者喜欢这样做。扔掉它是你能做的最好的事情。

标签: c# backgroundworker


【解决方案1】:

使用事件的全部目的,而不仅仅是委托,是它专门防止任何类型外部的代码执行除了添加或删除处理程序之外的任何操作。您既不能调用也不能检查添加到事件中的所有处理程序。

【讨论】:

    【解决方案2】:

    您可以写一个custom event accessor。当然,由于它是自定义的,因此您最终会自己进行跟踪,但您可以这样做。

    class MyClass
    {
        protected readonly List<EventHandler> list = new List<EventHandler>();
    
        public event EventHandler DoWork
        {
            add
            {
                list.Add(value);
            }
            remove
            {
                list.Remove(value);
            }
        }
    
        public void RaiseDoWork()
        {
            var args = new EventArgs();
            foreach (var func in list)
            {
                func(this, args);
            }
        }
    
        public IEnumerable<EventHandler> GetDoWorkDelegates()
        {
            return list;
        }
    }
    
    
    public class Program
    {
        public static void HandleDoWork(object sender, EventArgs e)
        {
            Console.WriteLine("Event fired.");
        }
    
        public static void Main()
        {
            var c = new MyClass();
            c.DoWork += HandleDoWork; 
            c.RaiseDoWork();
    
            foreach (var d in c.GetDoWorkDelegates())
            {
                Console.WriteLine("Method name was {0}.", d.Method.Name);
            }
        }
    }
    

    输出:

    Event fired.
    Method name was HandleDoWork.
    

    Working example on DotNetFiddle

    注意:如果您希望以上代码是线程安全的,则需要更多代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      相关资源
      最近更新 更多