有帮助吗?

解决方案

当您需要同步回(例如)UI *线程时,

BackgroundWorker 非常有用,例如出于亲和力原因。在这种情况下,似乎只使用 ThreadPool 就足够了(而且更简单)。如果你有大量的,那么生产者/消费者队列可能允许更好的限制(所以你不要淹没在线程中) - 但我怀疑 ThreadPool 在这里会没问题......

public void SendDataAsync()
{
    ThreadPool.QueueUserWorkItem(delegate
    {
        SendEmail();
    });
}

另外 - 我不太确定你想通过睡觉达到什么目的?这只会占用一个线程(不使用CPU,但也没有好处)。注意详细说明? 看起来就像你正在暂停你的实际网页(即睡眠发生在网页线程,而不是电子邮件线程)。你想在这做什么?

* =实际上,它将使用任何同步上下文

其他提示

生产者/消费者;基本上 - 只是值得保持一些类型的油门。在最简单的层面上,可以使用 Semaphore (以及常规的 ThreadPool )来限制已知的工作量(以避免使线程池饱和);但是生产者/消费者队列可能会更有效率和管理。

Jon Skeet有这样一个队列这里 CustomThreadPool )。如果你愿意,我可能会写一些关于它的笔记。

那就是说:如果你要打电话到外部网站,你很可能会在网络IO /完成端口上等待很多;因此,你可以拥有更高数量的线程......显然(相比之下)如果工作受CPU约束,那么没有任何一点比你拥有CPU内核更多的线程。

它可能会被拆除,因为在20秒之后,BackgroundWorker实例可能会被垃圾收集,因为它没有引用(超出范围)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top