有没有可能对后台工作人员有一个共同的方法?

本文关键字:方法 有一个 工作人员 有可能 后台 | 更新日期: 2023-09-27 18:18:27

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

现在我在一点,它暂时使UI无响应几秒钟,但我想创建background workers来完成这些任务。

创建这些的问题是,大约有9个按钮需要后台工作人员,他们所做的就是在DLL中调用不同的方法。是否有任何方法使用一个通用的方法来创建这些后台工作人员使用API的后台工作人员,或者我应该创建一个Enum对应于每个按钮,是一个参数的方法,构造后台工作人员。因此,这意味着我可以使用一个简单的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-event。

像这样

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();
    }
}

不使用BackgroundWorker,另一种选择是使用TPL。这将允许您直接在每个成员中编写代码:

void buttonImport_Click(object sender, DoWorkEventArgs e)
{
    Task.Factory
      .StartNew( () => return EngineBllUtility.GetNotImportedFiles(connectionString))
      .ContinueWith( t =>
    {        
        try
        {
            if (t.Result != null)
            {
                 importFileGridView.DataSource = t.Result.Tables[0];
            }
        }
        catch (AggregateException ex)
        {
            MessageBox.Show(ex.InnerException.Message);
        }
    }, TaskScheduler.FromCurrentSynchronizationContext());
}

当然,我不明白为什么你不能为此创建一个"交换机"之类的函数。事实上,您可能希望这样做,因为它会使事情变得更模块化,并促进代码重用。

就枚举而言,个人而言,我创建类来传入和传出大量的参数。

我认为您需要构建某种排队机制,其中一个后台工作人员拾取每个按钮单击作业并一个接一个地启动。

相关文章: