作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于使用线程的问题。我在 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 事件中停止这个线程。也许还有另一种方法可以做我想做的事??
最好的问候谢尔盖
最佳答案
如果您希望执行一个缓慢的操作直到它完成或直到您手动取消它,您可能需要使用 Task
和 CancellationToken
。对我来说,这似乎是最合适的方法:
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/
我是一名优秀的程序员,十分优秀!