这实际上咬了我几次.如果你做这样的简单代码:
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 1000000; i++)
{
Thread CE = new Thread(SendCEcho);
CE.Priority = ThreadPriority.Normal;
CE.IsBackground = true;
CE.Start();
Thread.Sleep(500);
GC.Collect();
}
}
private void SendCEcho()
{
int Counter = 0;
for (int i = 0; i < 5; i++)
{
Counter++;
Thread.Sleep(25);
}
}
Run Code Online (Sandbox Code Playgroud)
运行此代码并观察手柄飞!Thread.Sleep是这样你可以关闭它,它不会接管你的电脑.这应该保证在下一个线程启动之前启动的线程死掉.调用GC.Collect(); 什么也没做.根据我的观察,这个代码在正常刷新时每次刷新任务管理器时都会丢失10个句柄.
无效SendCEcho()函数中的内容无关紧要,如果需要,则计为5.当线程死亡时,有一个手柄无法清理.
对于大多数程序而言,这并不重要,因为它们不会长时间运行.在我创建的一些程序中,它们需要运行数月和数月.
如果反复运用此代码,最终可能会将句柄泄漏到Windows操作系统变得不稳定的位置,并且它将无法运行.需要重新启动.
我确实通过使用线程池和这样的代码解决了这个问题:
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadJobMoveStudy));
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么.Net中存在这样的泄漏,为什么它存在这么长时间?既然喜欢1.0?我在这里找不到答案.
在DICOM中有一个名为ISO_IR 58的双字节字符集.据我所知,.Net中的等效编码是gb2312.我试图用7位ASCII编码ISO_IR 58个字符,用于医疗系统之间的通信.
在java世界中,字符串gb2312用于执行此编码.
首先看一下ISO_IR 87的这个例子(ISO_IR 87等于.Net中的iso-2022-jp):
Encoding enc = Encoding.GetEncoding("iso-2022-jp");
byte[] bytes = enc.GetBytes("????^????=??^???");
string asciistring = ASCIIEncoding.ASCII.GetString(bytes);
Run Code Online (Sandbox Code Playgroud)
这将获取输入字符串并给出ASCII字符串:$ B = v <} RT; 2(B ^ $ B5nRRRONR(B = $ B5Q @ j(B ^ $ BRHGnFn(B)
使用所有正确的转义序列,我可以正确使用它.
(实际的第一个转义字符不会显示在此处,但粘贴时其余的序列会显示)
如果我将此代码与ISR_IR 58中的字符一起使用:
Encoding enc = Encoding.GetEncoding("gb2312");
byte[] bytes = enc.GetBytes("????^????^????");
string asciistring = ASCIIEncoding.ASCII.GetString(bytes);
Run Code Online (Sandbox Code Playgroud)
我只得到了字符串:???????? ^ ????????? ?????????
那么使用.Net的DICOM ISO_IR 58编码的答案是什么?我使用错误的字符串进行编码吗?.Net中不支持DICOM中的ISO_IR 58吗?.Net中有错误吗?它甚至可能吗?