订阅 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);
}
这个在我的OrderProcessing
class
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 明显的知识差距,我深表歉意,但希望这会在未来帮助其他人。
我正在与后台工作人员一起更新我正在处理的 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);
}
这个在我的OrderProcessing
class
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 明显的知识差距,我深表歉意,但希望这会在未来帮助其他人。