许多按钮触发backgroundWorker

时间:2019-01-25 20:52:02

标签: c#

在我的应用程序中,我有许多按钮可以通过backgroundWorker启动功能 例如:

private void button26_Click_1(object sender, EventArgs e)
{
      if (backgroundWorker1.IsBusy != true){
                disableControls();
                backgroundWorker1 = new BackgroundWorker();
                backgroundWorker1.DoWork += (obj, ev) => addAuctionDraftToDb(getIdsFromAllegroColection("id"));
                backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
                backgroundWorker1.WorkerReportsProgress = true;
                backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
                backgroundWorker1.RunWorkerAsync();
            }
        }

因为我有几十个触发不同功能的类似事件,我可以简短地编写或将其设置为简单类吗?

1 个答案:

答案 0 :(得分:0)

您正在尝试执行基于操作名称(addAuctionDraftToDb)的操作,这是IO操作。
在另一个线程上执行该操作将浪费线程,因为使用IO操作,线程不执行任何操作-仅等待来自远程资源的响应。

通过使用异步IO操作,您可以摆脱BackgroundWorker

例如,将数据库方法重写为异步方法

private async Task AddAuctionDraftToDb(List<int> draftIds)
{
    var query = "INSERT INTO ..";

    using (var connection = new SqlConnection(connectionString))
    using (var command = new SqlCommand(query, connection))
    {
        await connection.OpenAsync();
        await command.ExecuteNonQueryAsync();
    }
}

然后在按钮单击事件处理程序中,您可以照常编写代码,而在执行过程中不会阻塞UI,而所有内容都将在单个线程上退出。 注意事件处理程序的async void签名。

private async void button26_Click_1(object sender, EventArgs e)
{
    // Display something before execution

    var draftIds = getIdsFromAllegroColection("id");
    await AddAuctionDraftToDb(draftsId);

   // Display something when ready
}