gpt4 book ai didi

c# - 如何在按下按钮时启动线程并在再次按下时停止线程?

转载 作者:太空狗 更新时间:2023-10-29 20:55:54 25 4
gpt4 key购买 nike

我正在使用下一个代码来执行我要求的操作:

private delegate void CallerDelegate(object e);
CallerDelegate caler = new CallerDelegate(MethodToCall);

按钮点击事件:

if (currBusyThrd != null && currBusyThrd.IsAlive)
{
currBusyThrd.Abort();
}
ThreadPool.SetMaxThreads(1, 1);
//queue the work for thread processing
ThreadPool.QueueUserWorkItem(new WaitCallback(WaitCallbackMethod))

“WaitCallbackMethod”方法是:

void WaitCallbackMethod(object stateInfo)
{
// argList : i put some argument in a list to use it in "MethodToCall" ...
BeginInvoke(caler,argList);
}

我通过线程调用的方法是:

void MethodToCall(object args)
{
//Here I get the thread I'm calling to stop it when btn clicked again
currBusyThrd = Thread.CurrentThread;

// The rest of the code ...
}

我觉得这样不对……如何正确执行?

实际上调用将由 TextBox_KeyUp 进行。所以每次用户输入一个字符时,代码都会再次执行。而 BackgroundWorker 没有工作。

最佳答案

这种方法的一个问题是任意中止一个线程(几乎在任何语言中)都是非常危险的。围绕未释放的资源和错误锁定会弹出太多问题。通常最好设置某种标志以要求线程安全地中止自身或忘记线程并让它运行完成。

此外,中止线程池中的线程非常危险,我认为不支持该操作。 ThreadPool 中的线程不归您所有,冷中止它们会对 ThreadPool 产生严重影响。

这是我会采取的解决方案。

private object m_lock = new object();
private bool m_isRunning = false;
private bool m_isAbortRequested = false;

public void OnButtonClick(object sender, EventArgs e) {
lock ( m_lock ) {
if ( m_isRunning ) {
m_isAbortRequested = true;
} else {
m_isAbortRequested = false;
m_isRunning = true;
ThreadPool.QueueUserWorkItem(BackgroundMethod);
}
}
}

private void BackgroundMethod() {
try {
DoRealWork();
} finally {
lock (m_lock) {
m_isRunning = false;
}
}
}

private void DoRealWork() {
...
if ( m_isAbortRequested ) {
return;
}
}

关于c# - 如何在按下按钮时启动线程并在再次按下时停止线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1481569/

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