Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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#_Wpf_Backgroundworker - Fatal编程技术网

C# 订阅包含引用类的重写方法的类的事件

C# 订阅包含引用类的重写方法的类的事件,c#,wpf,backgroundworker,C#,Wpf,Backgroundworker,我正在与后台工作人员一起更新我正在处理的WPF UI中的进度条。这个后台工作程序从我订阅的多个事件中获取其进度更新,因为进度条经历了几个加载阶段,并且这些阶段的百分比来自几个地方。下面是一些示例/伪代码,解释了我的意思 我的后台工作人员的DoWork方法以及我当前用于获取某些进度更新的方法 // These are working fine private void BwOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs) {

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

我的后台工作人员的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);
}
我的订单处理类中的一些代码

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);
}
包含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方法中创建的OrderProcessing类从OrderProgress事件的OrderProcessingFiles中获取信息。当我的代码从未直接实例化OrderProcessingFile类的实例并且从未直接引用它时,我不确定如何订阅事件


我试着寻找答案,但正如我的标题所显示的那样,我很难用一种方式来表达这一点,以获得有用的结果,我真的很坚持这一点。如果需要更多详细信息,请告诉我。我试图将代码精简到相关部分,但我觉得我的解释有些奇怪。

我建议您创建一个线程安全的单例进度管理器。然后让每个后台工作人员与it部门联系并提供更新。进度管理器将使用在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.
        }
   }
}

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

这是我的用户界面

  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);
    }
这是在我的OrderProcessing类中

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

一切都像一个魔咒。很抱歉,我提出了一个完全令人困惑的问题,而且我所掌握的知识明显存在巨大差距,但希望这能在将来帮助其他人。

为什么需要多个活动?既然它们使用相同的签名,为什么不只是一个事件呢?那么您的派生类就可以使用它了。顺便说一句,BackgroundWorker有点老掉牙——我建议看看TPL任务、async/await和IProgress。@charlesmager你指的是OrderStatus和StandardOrderStatus吗?是的。然后您可以从CreateOrders中引发此单个事件。不过,我可能是说错了,因为不清楚你在问什么。@charlesmager好的,给我几分钟,我会再把它删掉一些,我想我的一些代码会分散我对真实世界的注意力issue@CharlesMager好吧,我把它拆了很多,如果这更有意义,请告诉我
 public override List<MasterSalesOrder> CreateOrders(List<BrandItem> BrandItems = null, List<BrandItemMasterCustomer> BrandItemMasterCustomers = null)
    {
        //Do some Stuff
        OnOrderProgressChanged(new OrderProgressEventArgs(count, totalItems, "Extracting"));
    }