首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将所有非UI代码移到不同的线程中是个好主意吗?

将所有非UI代码移到不同的线程中是个好主意吗?
EN

Stack Overflow用户
提问于 2018-08-23 03:41:52
回答 2查看 193关注 0票数 -1

我见过许多从事件处理程序异步执行长时间运行的代码的示例。例如,下面是WPF中按钮单击的事件处理程序:

代码语言:javascript
复制
public async void Button_Click(object sender, EventArgs e)
{
    await Task.Run(() => DoWork());
}

private int DoWork()
{
    for (int i = 0; i < 10000000; i++) { }
    return 42;
}

如果DoWork比较复杂,比如写入数据库,那么单击多个按钮可能会导致多个线程同时尝试写入数据库。

如果不是有许多这样的Task.Run调用,而是为所有非UI工作创建一个新的Thread,会怎么样呢?任务可以使用BlockingCollection之类的命令在这个线程上排队。

因为这个线程与UI线程是分开的,所以UI仍然是响应性的,并且单击多个按钮会将任务(按顺序)调度到同一个线程,从而避免并发问题。

这是个好主意吗?

EN

回答 2

Stack Overflow用户

发布于 2018-08-23 03:53:52

你所说的是一个可以在并行扩展中找到的QueuedTaskScheduler

也就是说,我不会简单地对所有操作进行排队。虽然您现在有了一个响应式的UI,但它看起来好像什么都没有发生。

我不会坚持做一个Task.Factory.StartNew。不能保证任务会启动新线程。任务和线程是两个不同的东西。默认的任务调度程序足够智能,可以判断是否有可用的必要资源来启动任务的新线程。如果您请求一组任务一次启动,队列将自动发生。

票数 1
EN

Stack Overflow用户

发布于 2018-08-23 03:56:43

对于长时间运行的操作,在大多数情况下使用异步是有意义的:Keep the UI thread responsive

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51974059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档