订阅 class 的事件,该事件包含您引用的 class 的覆盖方法

Subscribing to an event of a class that holds the override method of the class you reference

我正在与后台工作人员一起更新我正在处理的 WPF UI 中的进度条。这个后台工作人员正在从我订阅的多个事件中获取进度更新,因为进度条经历了几个加载阶段,并且这些阶段的百分比来自多个地方。这里有一些 example/pseudo 代码解释了我的意思

我的后台工作人员的 DoWork 方法以及我目前用来获取一些进度更新的方法

// These are working fine
private void BwOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
    orderProcessing.OnOrderProgress += OrderStatus;
    orderProcessing.OnStandardOrderProgress += StandardOrderStatus;
    orderProcessing.CreateOrders(orders); 
}

private void OrderStatus(int currentCount, int totalItems, string Message)
{
   if (totalItems > 0)
     bw.ReportProgress(Convert.ToInt32(((double)currentCount / (double)totalItems) * 100),
                        Message);
}

private void StandardOrderStatus(int currentCount, int totalItems, string Message)
{
   if (totalItems > 0)
      bw.ReportProgress(Convert.ToInt32(((double)currentCount / (double)totalItems) * 100),
                        Message);
}

我的订单处理中的一些代码class

public abstract class OrderProcessing
{
   public delegate void OrderProgress(int CurrentItems, int TotalItems, string Message);
   public event MasterSalesOrder.StandardOrderProgress OnStandardOrderProgress;
   public event OrderProgress OnOrderProgress;

   public abstract List<MasterSalesOrder> CreateOrders(List<Order> orders);
}

来自 class 的一些代码包含 CreateOrders() 的覆盖方法

public abstract class OrderProcessingFile : OrderProcessing
{
    public event OrderProgress OnOrderProgress;

    public override List<MasterSalesOrder> CreateOrders(List<Order> orders)
    {
        //Does Some Stuff

        foreach(var stuff in stuffs)
        {  
          OnOrderProgress(currentCount, totalCount, "Message");

        }
    }
}

由于我显然没有很好地解释这一点,我需要通过我在 DoWork method.I 中创建的 OrderProcessing class 从 OrderProcessingFiles OnOrderProgress 事件中获取信息 method.I 我不确定如何订阅当我的代码从不直接实例化 OrderProcessingFile class 的实例并且从不直接引用它时的事件。

我曾尝试寻找答案,但正如我的标题所示,我什至很难用一种方式来表达这一点以获得有用的结果,而我真的被困在这个问题上。让我知道是否需要更多细节,我试图将我的代码精简到只包含相关部分,但我觉得我解释得很奇怪。

我建议您创建一个线程安全的单例进度管理器。然后让每个后台工作人员联系它进行更新。进度管理器将使用 DispatcherTimer(在 GUI 线程上运行)来适当地更新 GUI。

原始示例:

public static class StatusReportManager
{
   // Standard singleton code to create the manager and access it.
   // Start/create the dispatch time as well.

   private static DispatcherTimer Timer { get; set; } 

   private static object _syncObject = new object();

   public static void ReportStatus(...) 
   {
      lock (_syncObject)
      {
         // Process any states and set instance properties for reading
         // by the timer operation.    
      }        
   }

   private void ShowStatus() // Used by the dispatch timer
   {
        lock (_syncObject)
        {
           // Do any updates to the GUI in here from current state.
        }
   }
}

我已经意识到我真正想做的是什么,因此找到了答案。使用 this MSDN 文章中的方法,我实现了以下代码:

这是我的UI

  private void BwOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
    {
        orderProcessing.OnOrderProgress += OrderStatus;
        orderProcessing.CreateOrders(FanGlobal.BrandItems, FanGlobal.BrandItemMasterCustomers);
    }
    private void OrderStatus(object obj, OrderProcessing.OrderProgressEventArgs e)
    {
        if (e.totalCount > 0)
           bw.ReportProgress(Convert.ToInt32(((double)e.currentCount / (double)e.totalCount) * 100),e.message);
    }

这个在我的OrderProcessingclass

 public event EventHandler<OrderProgressEventArgs> OnOrderProgress;
 public class OrderProgressEventArgs : EventArgs
    {
        public int currentCount;
        public int totalCount;
        public string message;

        public OrderProgressEventArgs(int c, int t, string m)
        {
            currentCount = c;
            totalCount = t;
            message = m;
        }
    }

 protected virtual void OnOrderProgressChanged(OrderProgressEventArgs e)
    {
        EventHandler<OrderProgressEventArgs> handler = OnOrderProgress;
        if (handler != null)
        {
            handler(this, e);
        }
        }
 public abstract List<MasterSalesOrder> CreateOrders(List<BrandItem> BrandItems = null, List<BrandItemMasterCustomer> BrandItemMasterCustomers = null);

然后我可以像这样在我的 child class OrderProcessingFile 中使用它

 public override List<MasterSalesOrder> CreateOrders(List<BrandItem> BrandItems = null, List<BrandItemMasterCustomer> BrandItemMasterCustomers = null)
    {
        //Do some Stuff
        OnOrderProgressChanged(new OrderProgressEventArgs(count, totalItems, "Extracting"));
    }

一切都运行良好。对于完全令人困惑的问题和我 have/had 明显的知识差距,我深表歉意,但希望这会在未来帮助其他人。