如何记录 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,而无需担心其他细节,并且能够有效地使用包装器。

如何记录 BackgroundWorker.RunWorkerAsync(Object) 的参数

只需说:

var myArg = (MyType)e.Argument;

这是100%清楚的空性和正确的类型。

使用错误会导致应有的崩溃。这是只有开发人员才能看到的崩溃。根本原因将是显而易见的。如果你想让它更明显:

Debug.Assert(e.Argument is MyType);
var myArg = (MyType)e.Argument;

如果您希望文档出现在RunWorkerAsync的调用站点,请将其包装:

void StartMyWorker(MyType arg) { ... }

现在,IDE 将向您显示正确的类型。