- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用线程池来(毫不奇怪)管理一组线程。我想做的是让他们在完成后发出信号,我有:
ManualResetEvent[] doneEvents = new ManualResetEvent[char_set.Length];
public struct string_char
{
public string[] _str_char;
public ManualResetEvent _doneEvent;
public string_char(string[] str_char, ManualResetEvent doneEvent)
{
_str_char = str_char;
_doneEvent = doneEvent;
}
}
我在这里有一个循环,它创建一个 char 数组,然后我创建一个我的结构实例来填充该 char 数组和一个完成事件:
doneEvents[no_of_elements - 1] = new ManualResetEvent(false);
string_char s_c = new string_char(array_holder, doneEvents[no_of_elements - 1]);
ThreadPool.QueueUserWorkItem(ThreadPoolCallback, s_c);
所以,线程被创建,添加到池中,它愉快地开始运行,当它完成时它设置完成事件:
public void ThreadPoolCallback(Object s_c)
{
string_char _s_c = (string_char)s_c;
//do the calculations...
//when done:
_s_c._doneEvent.Set();
}
回到主循环,代码在这里等待:
WaitHandle.WaitAll(doneEvents);
Console.WriteLine("All calculations are complete.");
问题是我一直收到异常:
'WaitAll for multiple handles on a STA thread is not supported.'
我已经在谷歌上查过了,但它并没有真正帮助,我做错了什么。这基本上是 ms msdn 示例的重复,除了我使用的是结构而不是类之外?
我解决了这个问题,使用下面的建议,主要是切换到 MTA(doh!);了解最大值为 64 个线程数也很有用。所以我将不得不切换到不同的等待模型,因为最终的应用程序将运行更多!很多东西要学。
谢谢。
最佳答案
以这种方式使用 WaitHandle.WaitAll
有几个问题。你已经发现了其中之一。另一个是它的可扩展性不是很好,因为它有 64 个句柄限制。这是我用来等待多个工作项完成的模式。它使用 CountdownEvent
类。
using (var finished = new CountdownEvent(1))
{
foreach (var workItem in workItemCollection)
{
var captured = item;
finished.AddCount();
ThreadPool.QueueUserWorkItem(
(state) =>
{
try
{
ProcessWorkItem(captured);
}
finally
{
finished.Signal();
}
}, null);
}
finished.Signal();
finished.Wait();
}
关于c# - WaitAll 和完成事件的线程问题 - 信号触发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6512413/
我听说在多个线程上使用 waitall 时存在限制(要等待的线程数?)。谁能给详细点? 最佳答案 我认为你所指的限制不是线程的数量;它取决于正在等待的句柄 的数量。来自MSDN page对于 Wait
假设我正在编写一个模拟用户在系统上执行某些操作的软件。我正在使用秒表测量完成此类操作所需的时间。 大多数时候这是非常简单的:模拟按钮的点击,一些服务调用与这个按钮相关联。测量完成此服务调用所需的时间。
当我可以让父任务等待它创建的所有任务时,我不确定创建子任务有什么好处。我运行以下代码,它在两种情况下产生了相同的结果。 public static void Main(string[] args) {
我有这样的情况: var retrievalTasks = new Task[2]; retrievalTasks[0] = GetNodesAsync(); retrievalTasks[1] =
我有少量任务,我想使用 Task.WaitAll 并行运行它们。这是我现在拥有的: type System.Threading.Tasks.Task with static member Wait
我有一个关于 Task.WaitAll 的问题。起初我尝试使用 async/await 来得到这样的东西: private async Task ReadImagesAsync(string HTML
我有一个控制台应用程序,我需要在其中从 4 个不同的站点检索一些数据。我将每个 HTTP 请求放在一个任务中,然后等待它们全部完成。 当我只需要从 2 个站点获取数据时,它就可以正常工作。但后来我需要
是否有可能不使用 WaitHandle.WaitAll(waitHandles) 阻止 winForm,而是设置另一个线程,当从 WaitHandle.WaitAll 获取完成信号时将触发该线程? 最
我想同时运行两个任务,其中一个任务中有一个 Task.Delay()。 即一个连续运行,一个每 15 分钟运行一次。 这是我目前所拥有的: public class ContinousAndAggre
为什么这不是每次都完成?相反,它会抛出一个异常,就像没有捕获到异常一样。此外,异常“索引超出数组范围”对我来说没有意义。 int n = 3; string[] nam
我正在尝试使用此异步代码来测试异步关键字: public async Task AsyncMethod() { var link = "http://www.google.com";
我有两个 ContinueWith 用于一个任务。第一个处理任务成功完成的情况,第二个处理任务失败的情况。然后我等到其中一个完成。示例代码如下: var task = Task.Factory.Sta
我正在使用我的可移植类库异步检索一些 rss 文章,该类库使用 Microsoft.Bcl 库(没有 Task.WhenAll)。每篇文章都有一个 rss 评论的 url,我也需要异步检索它。 下面的
我的目标是从 Amazon Web Services 存储桶下载图像。 我有以下代码功能,可以一次下载多张图片: public static void DownloadFilesFromAWS(str
我的代码中有这样一种情况,我开始执行未知数量的任务并想使用 Task.WaitAll()。 像这样: if (condition) { var task1 = Task.Factory.Sta
我创建了一个 Task 列表,如下所示: public void A() { } public void B() { } public void C() { } public void Ex() {
使用 System.Threading.Tasks.Task.WaitAll() 我可以看到我应该使用此方法的可用参数 可见here但是在 visual studio 中编写时,我可以调用完全没有参数
WaitAll 不工作。我在任务完成之前得到完成。 我有一些群组。每个组都包含项目,我希望每个项目在单独的任务中处理。 static void Main(string[] args) { Li
更新以更清楚地解释事情 我有一个运行多个任务的应用程序。有些是最初创建的,有些可以稍后添加。我需要一个编程结构来等待所有任务完成。一旦所有任务完成,应该运行一些其他代码来清理事情并对其他任务生成的数据
就并行性而言,这些是等价的吗? async Task TestMethod1() { Task t1 = GetInt1(); Task t2 = GetInt2(); awa
我是一名优秀的程序员,十分优秀!