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

时间:2014-11-29 14:43:09

标签: c# backgroundworker

我有一个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,而不必担心其他细节,并且能够有效地使用包装器。

1 个答案:

答案 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会显示正确的类型。