gpt4 book ai didi

c# - 从 backgroundworker 迁移到 async/await 方法

转载 作者:行者123 更新时间:2023-11-30 17:52:31 24 4
gpt4 key购买 nike

我一直在 WinForms C# 应用程序中使用 BackgroundWorkers 来执行任何 WCF 服务数据调用,如下所示:

private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
switch (_workerType)
{
case "search":


Data.SeekWCF seekWcf = new Data.SeekWCF();
_ds = seekWcf.SearchInvoiceAdmin(new Guid(cboEmployer.Value.ToString()), new Guid(cboGroup.Value.ToString()), txtSearchInvoiceNumber.Text, chkSearchLike.Checked, txtSearchFolio.Text, Convert.ToInt32(txtYear.Value));
seekWcf.Dispose();

break;

case "update":

Data.AccountingWCF accWcf = new Data.AccountingWCF();
_returnVal = accWcf.UpdateInvoiceAdmin(_ds);
accWcf.Dispose();

break;
}
}

例如,为了调用后台工作人员:

private void btnSearch_Click(object sender, EventArgs e)
{
if (!_worker.IsBusy)
{

ShowPleaseWait(Translate("Searching data. Please wait..."));
_workerType = "search";
_worker.RunWorkerAsync();
}
}

现在,我想开始迁移到 Task (async/await) C# 5.0,所以我在这个例子中所做的是:

private async void ProcessSearch()
{

Data.SeekWCF seekWcf = new Data.SeekWCF();
_ds = seekWcf.SearchInvoiceAdmin(new Guid(cboEmployer.Value.ToString()), new Guid(cboGroup.Value.ToString()), txtSearchInvoiceNumber.Text, chkSearchLike.Checked, txtSearchFolio.Text, Convert.ToInt32(txtYear.Value));
seekWcf.Dispose();
}

但在这里我收到一条消息说“此异步方法缺少‘await’运算符并将同步运行”。

关于最佳实践和完成我想要完成的事情的正确方法的任何线索?

最佳答案

理想情况下,您的 WCF 服务包装器应具有其方法的异步版本,即 SearchInvoiceAdminAsync。然后你会等待它:

        private async Task ProcessSearchAsync()
{

Data.SeekWCF seekWcf = new Data.SeekWCF();
_ds = await seekWcf.SearchInvoiceAdminAsync(new Guid(cboEmployer.Value.ToString()), new Guid(cboGroup.Value.ToString()), txtSearchInvoiceNumber.Text, chkSearchLike.Checked, txtSearchFolio.Text, Convert.ToInt32(txtYear.Value));
seekWcf.Dispose();
}

已编辑:另一件事是,最终您需要从常规方法调用您的异步方法,例如,在单击按钮时,并且可能在任务完成时做一些事情。这是一个非常简单的场景:

// UI Thread

Task _pendingTask = null;

void button_click()
{
if ( _pendingTask != null)
{
MessageBox.Show("Still working!");
}
else
{
_pendingTask = ProcessSearchAsync();


_pendingTask.ContinueWith((t) =>
{
MessageBox.Show("Task is done!");
// check _pendingTask.IsFaulted here
_pendingTask = null;
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}

已编辑:请注意,最初我在调用 ContinueWith 时忘记指定 TaskScheduler。这可能导致在池线程上调用 continuationAction

关于c# - 从 backgroundworker 迁移到 async/await 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18290556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com