gpt4 book ai didi

c# - 如何在 WinForms C# 中使用线程?

转载 作者:行者123 更新时间:2023-11-30 14:08:41 24 4
gpt4 key购买 nike

我有一个关于使用线程的问题。我在 WinForms 中有一个应用程序。我有一个带有方法的开始按钮。当我单击它时,该方法开始执行并持续很长时间。当该方法正在执行时,表单未处于事件状态,我什至无法关闭它,直到该方法结束。我想让表单处于事件状态并单击另一个按钮(停止按钮)以停止执行方法。

    private void start_Click(object sender, EventArgs e)
{
StartLoading() //Some Method which performing I want to stop at any time
}

private void stop_Click(object sender, EventArgs e)
{
//Stop performing Method from start_Click
}

我尝试使用下一个代码:

    private void start_Click(object sender, EventArgs e)
{
Thread StartThread = new Thread(StartLoading);
StartThread.Start();
}

public void StartLoading()
{
}

而且它有效。该方法在窗体保持事件状态时执行。但是我不知道如何在 stop_Click 事件中停止这个线程。也许还有另一种方法可以做我想做的事??

最好的问候谢尔盖

最佳答案

如果您希望执行一个缓慢的操作直到它完成或直到您手动取消它,您可能需要使用 TaskCancellationToken。对我来说,这似乎是最合适的方法:

public class MyForm
{
private CancellationTokenSource cts = new CancellationTokenSource();
private Task task;

private void buttonStart_Click(object sender, EventArgs e)
{
buttonStart.Enabled = false;
buttonCancel.Enabled = true;

task = Task.Factory.StartNew(() => {
// do something extremely slow
// and use 'ThrowIfCancellationRequested'

for (int i = 0; i < Int32.MaxValue; i++)
{
Thread.Sleep(10);
cts.Token.ThrowIfCancellationRequested();
}
}, cts.Token).ContinueWith(t => {
if (t.IsCanceled)
{
// User has cancelled loading
}
if (t.IsFaulted)
{
// Exception has occured during loading
}
if (t.IsCompleted)
{
// Loading complete
}
});
}

private void buttonCancel_Click(object sender, EventArgs e)
{
buttonStart.Enabled = true;
buttonCancel.Enabled = false;

cts.Cancel();
}
}

关于c# - 如何在 WinForms C# 中使用线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34149221/

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