gpt4 book ai didi

multithreading - 在 c# .Net 3.5 中,如何控制多个 WaitHandles?

转载 作者:行者123 更新时间:2023-12-04 08:27:28 25 4
gpt4 key购买 nike

我有以下场景:

我的应用程序必须从另一个应用程序导入多组数据,时间紧迫。
因此,它会为每次导入生成一个线程。
因此,假设我有导入 1 到 10,其中导入 4 和 5 只能在导入 1 之后运行,导入 2 之后才能运行导入 6 和 7,导入 3 之后才能运行导入 8、9 和 10

  • 导入 1
    • 导入 4
    • 导入 5
  • 导入 2
    • 导入 6
    • 导入 7
  • 导入 3
    • 导入 8
    • 导入 9
    • 导入 10

在 stackoverflow 上搜索,我找到了一些关于 waithandles 的答案,但我不确定如何控制多个 waithandles。
我想创建一个导入/句柄列表并循环检查它们,但我不知道如何从那里触发 .set()。
或者为每个父导入创建一个线程并实例化其中的句柄,并且该父线程为每个子导入触发一个线程,但我不确定处理线程的线程是否正确。

关于如何解决这个问题的任何想法?

更新:
在 Brian Gideon 的回答之后,我想到了以下内容:
dateSince = Convert.ToDateTime(txtBoxDateSince.Text);
dateTo = Convert.ToDateTime(txtBoxDateTo.Text);



<p>//Loop all the days on the time interval
while (DateTime.Compare(dateSince, dateTo) <= 0)
{</p>

<pre><code>foreach (ListItem father in checkBoxListFather.Items)
{
if (father.Selected == true)
{
processClass process = new processClass();

// This WaitHandle will be used to get the child tasks going.
var wh = new ManualResetEvent(false);

//Method to Import, wraped in a delegate
WaitCallback fatherMethod = new WaitCallback(process.importProcess);
//and its parameters
processClass.importParameters param = new processClass.importParameters(wh, father.Value, null, dateSince);

// Queue the parent task.
ThreadPool.QueueUserWorkItem(fundMethod, param);

// Register the child tasks.
foreach (ListItem child in checkBoxListChild.Items)
{
if (child.Selected == true)
{
processClass.importParameters parameters = new processClass.importParameters(null, child.Value, null, dateSince);

// Registers a callback for the child task that will execute once the
// parent task is complete.
WaitOrTimerCallback childMethod = new WaitOrTimerCallback(process.anotherImportProcess);
RegisteredWaitHandle rwh = ThreadPool.RegisterWaitForSingleObject(wh, childMethod, parameters, Timeout.Infinite, true);

}//End if (child.Selected == true)

}//End foreach (ListItem fund in checkBoxListChild.Items)

}//End if (father.Selected == true)

}//End foreach (ListItem fundProcess in checkBoxListFather.Items)

dateSince = dtSince.AddDays(1);
</code></pre>

}//End while (DateTime.Compare(since,to) < 0)

几乎相同的答案,只是使用了没有 lambda 表达式的方法并在它们上使用了参数。
我仍然没有对其进行压力测试,但它工作得很好。

谢谢布莱恩。

最佳答案

你知道吗

  1. WaitHandle.WaitAny Method
  2. WaitHandle.WaitAll Method

如果线程本质上是简单线性的,并且您不需要为可扩展性排队,您可以使用 C#: Waiting for all threads to complete

关于multithreading - 在 c# .Net 3.5 中,如何控制多个 WaitHandles?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6060789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com