在我的应用程序中,我有许多按钮可以通过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();
}
}
因为我有几十个触发不同功能的类似事件,我可以简短地编写或将其设置为简单类吗?
答案 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
}