我有一个DoWorkEventHandler
需要RunWorkerAsync
来电的论据。
public static void ProcessData(object sender, DoWorkEventArgs e)
{
if (e.Argument == null)
throw new ArgumentNullException();
MyType argument;
try
{
argument = (MyType)e.Argument;
}
catch
{
throw new ArgumentException("Argument passed is not from type MyType");
}
/* ... */
}
如果用户在没有参数的情况下执行RunWorkerAsync
,传递null
或传递无法转换为MyType
的参数,它将抛出。
我可以做这样的事情来记录这个需要
/// <summary>...</summary>
/// <param name="e">e.Argument must be of type MyType</param>
public static void ProcessData(object sender, DoWorkEventArgs e) { /*...*/ }
但是,在用户写完
之后var worker = new BackgroundWorker();
worker.DoWork += ProcessData;
当他/她写这行时
worker.RunWorkerAsync();
IDE不会显示参数的必要性。
有什么方法可以让IDE向用户显示该信息?
如果没有,我该如何记录?
编辑: 我不能像this一样使用包装器RunWorkerAsync()。 DoWork在模型上实现,ProgressChanged和RunWorkerCompleted在viewmodel上实现,因为每个viewmodel实现不同的处理程序。
Edit2:实际上@usr的答案就可以了。如果我在模型中声明后台工作者,并简单地公开2个委托,它将完成这一操作,允许我将业务与设计分开,允许view / viewmodel实现ProcessChanged和RunWorkerCompleted,而不必担心其他细节,并且能够有效地使用包装器。
答案 0 :(得分:3)
简单地说:
var myArg = (MyType)e.Argument;
这是100%清楚无效和正确的类型。
使用错误会导致崩溃,就像它应该的那样。这是一个只有开发者看到的崩溃。根本原因是显而易见的。如果你想让它变得更加明显:
Debug.Assert(e.Argument is MyType);
var myArg = (MyType)e.Argument;
如果您希望文档显示在RunWorkerAsync
的调用网站上,请将其包装:
void StartMyWorker(MyType arg) { ... }
现在,IDE会显示正确的类型。