2 回答
TA贡献1863条经验 获得超2个赞
好的,我尝试通过以下方式使用任务取消:
public MainForm()
{
InitializeComponent();
cts = new CancellationTokenSource();
Load += MainForm_Load;
FormClosing += MainForm_FormClosing;
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
cts.Cancel();
}
private void MainForm_Load(object sender, EventArgs e)
{
CancellationToken ct = cts.Token;
Action action = () => { lblTime.Text = DateTime.Now.ToLongTimeString(); };
var task = Task.Factory.StartNew(async () => {
ct.ThrowIfCancellationRequested();
while (true)
{
Invoke(action);
await Task.Delay(100);
}
}, ct);
}
不知道是否正确,但即使将时间间隔设置为 10 毫秒,它似乎也有效。
TA贡献1876条经验 获得超7个赞
在您的第一个示例中,任务不知道您的应用程序正在退出,并且在标签销毁后有调用操作的风险,因此ObjectDisposedException
.
尽管您尝试在第二个示例中提醒任务,但它并不是真正的线程安全,并且您仍然可以在处理控件后调用该操作。
计时器
更好的解决方案是仅使用 WinForms Timer
。如果您通过设计器将计时器放置在表单上,它会自动将其注册为组件依赖项,从而使生命周期管理变得更加容易。
使用 WinForm 计时器,您无需担心线程或Task
s,更重要的是,您无需担心Invoke
是否需要更新 UI(与子线程或非 UI 上下文任务相反)
- 2 回答
- 0 关注
- 191 浏览
添加回答
举报