【问题标题】:c# Multi Threadc# 多线程
【发布时间】:2018-04-03 09:32:35
【问题描述】:

我得到了一个打印服务,它现在也可以进行文件集成,以便同时完成这两项任务,尽管我使用线程。

看到这个Thread Tutorial之后,我就搜索了Join do.是什么

如果我没记错的话,Join 会终止线程,对吗?所以我的问题是,由于服务应该 24/7 全天候运行,直到有人需要停止线程,我可以只做一个 Thread.Sleep 让他们等待下一次交互而不是加入并再次启动他们吗?

即使他们使用不同的方法处理不同的对象,他们仍然会产生死锁吗?由于它是用于服务的,因此我不能让它多次出现死锁。

编辑:我做了以下测试,它似乎运行良好,任何有更多使用线程经验的人可以检查是否会在以后给我带来问题? (此代码是测试样例,不是我的服务)。

My sample

【问题讨论】:

  • “加入终止线程,对吗?”。阅读您的链接:“加入等待线程完成”
  • 是的,但如果我想让线程保持活力,我必须避免加入,对吧?
  • 我建议使用 Tasks,阅读一下albahari.com/threading/part5.aspx#_Task_Parallelism
  • @Evk 我添加了一个示例,你能检查一下并告诉我以后是否会给我带来问题吗?我编辑了我的问题,这不是我的实际服务,只是我在实施之前用来测试线程的示例。

标签: c# multithreading service


【解决方案1】:

join 会终止线程,对吧?

不,它一直等到线程完成。

我可以只做一个 Thread.Sleep 让他们等待下一次交互,而不是加入并再次启动他们吗?

是的,你可以这样做。根据您的架构,您还可以使用 BlockingCollection 将项目排队以在单独的线程中处理,并在另一个线程中执行。

即使他们使用不同的方法处理不同的对象,他们仍然会产生死锁吗?

好吧,如果您以错误的方式编写代码,他们可以。除了始终牢记两个方法可能同时调用一些共享代码,从而导致竞争条件和死锁之外,没有快速简便的解决方法。

【讨论】:

  • 但是如果我想杀死线程,我应该使用 Join,对吧?如果我想让它长时间运行,我应该避免加入。
  • 不,如前所述,Join 一直等到线程完成。它不会杀死线程。 Abort 这样做。
  • 好的。我注意到在我做的一个测试中, .Start 让它只运行一次,做一个循环我应该使用 .Start 每次我想要它运行?例如,在我的 HandleRun() 使用 Thread.Sleep() 调用的 Run() 中,我应该放置一个 Thread.Start() 吗?
  • 我用一个示例更新了我的问题,您能否快速检查一下,看看是否可以正常工作,或者以后是否会给我带来任何问题?
  • 阅读一些文档比让我们评论开放式代码转储更好。
猜你喜欢
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多