如何记录 BackgroundWorker.RunWorkerAsync(Object) 的参数
本文关键字:Object 参数 RunWorkerAsync BackgroundWorker 记录 何记录 | 更新日期: 2023-09-27 18:32:23
我有一个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 向用户显示该信息?
如果没有,我应该如何记录?
编辑:我不能像这样使用包装器arount RunWorkerAsync()。DoWork 在模型上实现,ProgressChanged 和 RunWorkerDone 在视图模型上实现,因为每个视图模型实现不同的处理程序。
编辑2:实际上@usr答案就可以了。如果我在模型中声明后台工作线程,并仅公开 2 个委托,它将起作用,允许我将业务与设计完全分离,允许视图/视图模型实现 ProcessChanged 和 RunWorkerComplete,而无需担心其他细节,并且能够有效地使用包装器。
只需说:
var myArg = (MyType)e.Argument;
这是100%清楚的空性和正确的类型。
使用错误会导致应有的崩溃。这是只有开发人员才能看到的崩溃。根本原因将是显而易见的。如果你想让它更明显:
Debug.Assert(e.Argument is MyType);
var myArg = (MyType)e.Argument;
如果您希望文档出现在RunWorkerAsync
的调用站点,请将其包装:
void StartMyWorker(MyType arg) { ... }
现在,IDE 将向您显示正确的类型。