gpt4 book ai didi

C# BackgroundWorker线程问题

转载 作者:太空宇宙 更新时间:2023-11-03 19:36:12 24 4
gpt4 key购买 nike

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace ClassLibrary
{
public class MyClass
{
public static string LongOperation()
{
Thread.Sleep(new TimeSpan(0,0,30));

return "HelloWorld";
}
}
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using ClassLibrary;

namespace BackgroungWorker__HelloWorld
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
if (backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}

MyClass.LongOperation();

e.Result = "[Result]";
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
if (e.Cancelled)
{
MessageBox.Show("The task has been cancelled");
}
else if (e.Error != null)
{
MessageBox.Show("Error. Details: " + (e.Error as Exception).ToString());
}
else
{
MessageBox.Show("The task has been completed. Results: " + e.Result!=null?e.Result.ToString():" null");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void btnStart_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}

private void btnClose_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy)
{
backgroundWorker1.CancelAsync();
}
else
{
this.Close();
}
}
}
}

我发现,执行以下代码后:

private void btnClose_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy)
{
backgroundWorker1.CancelAsync();
}
else
{
this.Close();//"this" means the Form object
}
}

backgroundWorker1 的线程不会立即被杀死。这需要一些时间。

这是构建我的应用程序逻辑时遇到的问题。

谁能在这方面帮助我?

最佳答案

解决方案是更改 BackgroundThreadDoWork() 事件处理程序以提高响应速度:它需要将其工作分成更小的 block 并轮询工作人员的 CancellationPending 足够频繁以满足您的应用程序的需求。


编辑:鉴于您添加的代码,您将无法使用BackgroudWorker 执行您想要的操作。

如果您不能修改 MyClass.LongOperation(并且它不提供任何 Hook 让您中断它)但您想让用户在该操作完成之前取消,您可以通过以下方式实现创建您自己的 Thread(作为后台线程,如果您放弃它,它不会让您的应用程序保持打开状态)。理论上,您也可以使用 ThreadPool.QueueUserWorkItem 来完成它,除了将 ThreadPool 用于长时间运行的进程是个坏主意(有关详细信息,请参见 The Managed Thread Pool)。

最后,您可以考虑将长时间运行的操作移出带外 - 将消息写入队列、调用服务或使用其他技术将其移交给另一个进程。

关于C# BackgroundWorker线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1471563/

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