c# - 后台 worker 可以有一个通用的方法吗?

标签 c# .net enums backgroundworker

我注意到,随着我的应用程序数据库的增长,返回结果所需的时间也增加了。一开始这可以忽略不计,因为返回数据源的时间非常短。

现在我正处于暂时使 UI 无响应几秒钟的地步,但我想创建 background workers 来完成这些任务。

创建这些按钮的问题在于,大约有 9 个按钮需要后台 worker ,而他们所做的只是调用 DLL 中的不同方法。有没有什么方法可以使用通用方法使用后台工作人员的 API 创建这些后台工作人员,或者我应该创建一个 Enum 对应于每个按钮并且是构造后台 worker 。这意味着我可以使用一个简单的 switch 来执行我选择的 DLL 中的任何方法?

示例代码:

    void bg_DoWorkImports(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        try
        {
            e.Result = EngineBllUtility.GetNotImportedFiles(connectionString);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    void bg_RunWorkerCompletedImports(object sender, RunWorkerCompletedEventArgs e)
    {
        DataSet temp = (DataSet)e.Result;
        if (e.Result != null)
        {
            importFileGridView.DataSource = temp.Tables[0];
        }
    }

最佳答案

你可以传递一个 Func<T> 到创建 BackgroundWorker 并从内部调用该操作到 DoWork 事件的方法。

像这样

public class BackgroundWrapper<T>
{
    private Func<T> workMethod;
    private Action<T> completeMethod;
    public static void StartBackgroundworker(Func<T> workMethod, Action<T> completeMethod)
    {
        BackgroundWrapper<T> bWrap = new BackgroundWrapper<T>();
        bWrap.workMethod = workMethod;
        bWrap.completeMethod = completeMethod;
        bWrap.Start();
    }

    private void Start()
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        bw.RunWorkerAsync();
    }

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        completeMethod((T)e.Result);
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        e.Result = workMethod();
    }
}

关于c# - 后台 worker 可以有一个通用的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8594412/

相关文章:

c# - TextChanged 事件如何确定发生了什么变化

c# - 类似于 IList.IndexOf() 但在 IEnumerable<T> 上的东西?

java - 如何创建包含未知枚举数组的 Java 注释?

java - 初始化枚举中的列表

c# - 如何使用自定义属性属性对类的属性进行排序

C# 语法 - 变量名后的冒号

C# - 实现具有两个公共(public)接口(interface)的私有(private)类,然后转换为它们两个?馊主意?

c# - 如何在 .NET 中每小时(或每小时特定时间间隔)引发一个事件?

c# - 如何声明作为通用参数提供的通用值类型的 const 字段

c# - 以编程方式解锁 Windows