我的代码是
public static void Invoke(Action[] Actions)
{
Thread[] threadArray = new Thread[Actions.Length];
for (int i = 0; i < Actions.Length; i++)
{
threadArray[i] = new Thread(() =>
{
Actions[i].Invoke();
});
threadArray[i].Start();
}
}
public static void WaitAll()
{
}
public static void WaitAny()
{
}
我想等待所有线程完成,并在任何线程完成时得到通知,
像 WaitAny, WaitAll
但是 waithandles 只能在线程池上使用,找不到任何在单线程上使用的例子。
我的应用程序需要很多线程,数百个,adpool 有最大线程限制,其余任务排队。
我该如何管理?
更新:这是代码,如果有更好的代码,请告诉我。
public class ParallelV2
{
static int waitcount = 0;
static WaitHandle[] waitHandles;
public static void Invoke(Action[] Actions)
{
waitcount = Actions.Length;
Thread[] threadArray = new Thread[Actions.Length];
waitHandles = new WaitHandle[Actions.Length];
for (int i = 0; i < Actions.Length; i++)
{
var count = i;
waitHandles[count] = new AutoResetEvent(false);
threadArray[count] = new Thread(() =>
{
Actions[count].Invoke();
((AutoResetEvent)waitHandles[count]).Set();
});
threadArray[count].Start();
}
}
public static void WaitAll()
{
while (waitcount > 0)
{
WaitHandle.WaitAny(waitHandles);
waitcount--;
}
}
public static void WaitAny()
{
WaitHandle.WaitAny(waitHandles);
}
}
最佳答案
在下面的示例中,我需要跟踪三个线程。每个线程在完成后都会设置其相应的句柄。
声明如下:
private WaitHandle[] waithandles; // see comment on static below
像这样创建它:
waitcount = 3;
waithandles = new WaitHandle[3] { new AutoResetEvent(false), new AutoResetEvent(false), new AutoResetEvent(false) };
在线程中,当它结束时,这样设置:
((AutoResetEvent)waithandles[i]).Set();
(实际上,这过于简单了,但如果您将等待句柄设为静态,它就会起作用。我实际上所做的是让线程在其生命周期结束时执行回调以向等待句柄发出信号)
在主线程中,这样检查。当等待计数达到零时,我知道所有线程都已完成
while (waitcount > 0)
{
WaitHandle.WaitAny(waithandles, 30000);
waitcount--;
}
关于c# - 单个线程上的线程 WaitHandle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6741540/
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我正在尝试使用ruby编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?
我是ruby的新手,我认为重新构建一个我用C#编写的简单聊天程序是个好主意。我正在使用Ruby2.0.0MRI(Matz的Ruby实现)。问题是我想在服务器运行时为简单的服务器命令提供I/O。这是从示例中获取的服务器。我添加了使用gets()获取输入的命令方法。我希望此方法在后台作为线程运行,但该线程正在阻塞另一个线程。require'socket'#Getsocketsfromstdlibserver=TCPServer.open(2000)#Sockettolistenonport2000defcommandsx=1whilex==1exitProgram=gets.chomp
我有一个.pfx格式的证书,我需要使用ruby提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o