gpt4 book ai didi

c# - C#BackgroundWorker偶尔需要很长时间才能启动

转载 作者:行者123 更新时间:2023-12-03 13:20:57 27 4
gpt4 key购买 nike

我在使用BackgroundWorker时遇到问题。发生的情况是BackgroundWorker进程可以正常运行,然后有时大约需要40-50秒才能开始。

该问题已在两台计算机上发生。 BackgroundWorker的操作在一天中都工作正常,然后在下午开始出现此问题,该过程需要40秒而不是1秒的时间,但仅偶尔发生。您可以将其中5个罚款,而第6个则需要40秒。然后,您可以再做5次罚款。如果确实开始花费的时间超过一秒钟,则只需在workingDialog上按Cancel,然后立即再次进行操作即可。经过进一步检查,工作人员似乎没有立即启动DoWork方法。

我可能会用完线程或其他东西吗?或我如何处置BackgroundWorker可能有问题?代码如下;

using (workingDialog = new Dialogs.WaitDialog()) {
StartThreadedWork(MyDoWorkMethod, customerID);

// if user presses cancel button
if (workingDialog.ShowDialog() == System.Windows.Forms.DialogResult.Cancel) {
m_Worker.RunWorkerCompleted -= ThreadFinished;
}
}
m_Worker.Dispose();
m_Worker = null;

“StartThreadedWork”方法如下;
private void StartThreadedWork(DoWorkEventHandler method, int customerID) {
m_Worker = new BackgroundWorker();
m_Worker.DoWork += method;
m_Worker.RunWorkerCompleted += ThreadFinished;
object[] parameters = new object [] {customerID };
m_Worker.RunWorkerAsync(parameters);
}

最后,分配给DoWork事件处理程序的方法是:
private void ThreadSyncing(object sender, DoWorkEventArgs e) {
object[] parameters = e.Argument as object[];
int customerID = (int)parameters[0];
Customer resultCustomer = new Customer(FormsManager.Instance.BillingWebService.Customer_GetByCustomerID(customerID, CustomerSyncOption.Default));
e.Result = resultCustomer;
}

触发RunWorkerCompleted事件后,对话框结果将设置为“确定”,并且对话框将关闭。

任何有关此问题的建议将不胜枚举!

谢谢,

最佳答案

您怎么知道实际上是BGW的启动被延迟了?您没有提供任何反馈,您只能看到它已完成。看起来您正在使用Web服务,服务器无响应或完成请求40秒钟并非异常。默认的tcp/ip连接超时为45秒。

ThreadPool调度程序可以发挥作用,它试图将执行TP线程的数量限制为计算机拥有的cpu内核的数量。但是,获得40秒的延迟是一个沉重的困境。如果现有线程未完成,则调度程序允许另一个TP线程启动,每秒两次。因此,您将必须有80个 Activity TP线程来产生这样的延迟。

关于您使用的对话框值得注意的一件事,它实际上并没有做任何事情来停止工作线程。它只是放弃了。因此,如果服务器无响应且用户不耐烦,您可能会积累精力。四次敲击她的脚后,反复按“取消”按钮。确实会导致延迟不断增加。您应该使用CancelAsync()方法,并使用CancellationPending属性实现取消逻辑。但是,是的,使用Web服务通常并不容易。

通过提供更好的反馈来解决该问题。用户取消后,请勿取消订阅RunWorkerCompleted事件。只需设置一个标志,指示上一个请求已被取消。在工作人员完成之前,在您的UI中显示Web服务不可用。包括不允许用户再次启动Web服务请求。

关于c# - C#BackgroundWorker偶尔需要很长时间才能启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12341010/

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