问题:
我正在开发一个应用程序,在该应用程序中进行一些耗时的操作,我应该在带有取消按钮的表单(WinForm)上显示进度条。所以很明显我正在使用 BackgroundWorker 线程。下面是大致模拟我想要实现的代码的代码。
namespace WindowsFormsApplication1
{
public delegate void SomeDelegateHandler();
public partial class Form1 : Form
{
public event SomeDelegateHandler DoSomeAction;
BackgroundWorker bgWorker;
public Form1()
{
InitializeComponent();
bgWorker = new BackgroundWorker();
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
}
void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
//Some logic code here.
for (int i = 0; i < 100; i++)
{
DoSomeAction();
}
}
private void Form1_Shown(object sender, EventArgs e)
{
if (DoSomeAction != null)
bgWorker.RunWorkerAsync();
else throw new EventNotSubscribedException();//Is this a valid style??
}
}
public class EventNotSubscribedException : ApplicationException
{
//Some custom code here
}
}
我的解决方案
根据上面的代码,只要向用户显示表单(OnShown 事件),我就会启动 backgroundworker 线程。这是因为,用户不需要为此发生任何动作。所以 onshown 做耗时的操作工作。但问题是,正如我上面所展示的,主要耗时的工作是在其他类/组件上执行的,它的边界也很紧(遗留代码:无法重构)。因此,我在启动此表单的旧代码类中订阅了事件 DoSomeAction。
疑问/问题:
如上所示抛出异常是否有效?(请在下面阅读我的理由)。
理由:
OnShown 事件会检查事件处理程序对象上的空值。这是因为,为了使这个表单可用,事件必须由订阅者订阅(使用代码),然后只有它才能工作。如果没有,那么表单只是显示并且根本没有记录,并且使用代码可能不知道为什么会这样。使用代码可能假设订阅事件是选项,就像每个按钮单击事件一样。
希望我的帖子清晰易懂。
谢谢和快乐的编码,Zen :)