如下代码 public static class Debug
{
static Debug()
{
var thread = new Thread(() =>
{
int i = 3;
MessageBox.Show("end");
});
thread.IsBackground = true;
thread.Start();
Thread.Sleep(3000);
while (true)
Thread.Sleep(1000);
}
}thread的ThreadState始终是Background , 而且无法进入线程。
如果去掉 while ,就可以
或者不去掉while,去掉IsBackground 也可以。
糊涂了
{
static Debug()
{
var thread = new Thread(() =>
{
int i = 3;
MessageBox.Show("end");
});
thread.IsBackground = true;
thread.Start();
Thread.Sleep(3000);
while (true)
Thread.Sleep(1000);
}
}thread的ThreadState始终是Background , 而且无法进入线程。
如果去掉 while ,就可以
或者不去掉while,去掉IsBackground 也可以。
糊涂了
解决方案 »
- 查看传递数值
- 求助:文本文件定时读取问题,谢谢!
- 高分求助httpwebrequest问题 急!!
- 判断label控件重合或接触
- 接口的方法在第一层类里应该不能私有啊?请帮我看看这是怎么回事,应该怎么理解?
- 求一个可以通用的事务类 高手来
- C#应用中的集合算法,子集的比对
- 如何将一个窗体嵌入到一个Panel上
- 在字段前面加一个static,在主函数中,只能通过类来调用, 而非静态的成员为什么就可以用对象来调用, 这其中的原理是什么呢
- c#下多线程的tcp粘包问题,请高手指点思路。
- c#如何调用注入到其他进程的dll中的方法
- C#的winform,就是textbox里的值一发生变化就响应的事件?
while (true){
Thread.Sleep(1000);
Application.DoEvents();
}加上一句在试下,应该可以执行到的
是的,在非static中完全没问题,我也试过了,但是在static中就有问题,我还在测试
线程属性设置为IsBackground = true后
线程起不来
不够还没时间跟踪下情况
楼主解决了
贴出来分享下
而且一定要是static才有这个问题。
似乎很奇怪,在找国外这方面的资料
额,不是你说的这样, Debug模式也进不去 int i = 3 这行。 ThreadState显示 Background
而且是Winform模式,不是Console模式。
另外, 有个问题求教,
MessageBox 内建消息循环(Win32:GetMessage()) ,同时是模态显示,
应该不需要外接支持,
为何您会说没有消息循环?
using System;
using System.Reflection;using System.Threading.Tasks;
using System.Threading;
using System.Collections.Generic;using norlib;
using System.Windows.Forms;
namespace csdnHelper
{
public class Example
{
public Example()
{
MessageBox.Show(ClassBTLocal.Number.ToString());
}
}
public static class ClassBTLocal
{
static ClassBTLocal()
{
bool bEnd = false;
var thread = new Thread(() =>
{
bEnd = true;//尝试注释此句
int i = 3;
MessageBox.Show("end");
});
thread.IsBackground = true;//尝试注释此句
thread.Start();
while (bEnd)
;// Thread.Sleep(1000);
}
public static int Number = 123;
}
}大家看看是怎么回事。
如果ThreadProc里面没有 bEnd 这个内部变量,线程就不会运行,还有IsBackground
CLR要求类型被访问前静态构造函数被执行一次:如果线程尝试访问某个类型时,静态构造函数还没有开始执行,那么当前线程就执行类型的静态构造函数;如果类型的静态构造函数正在被其他某条线程执行,当前线程会阻塞,等待静态构造函数执行完毕。
所以,如果静态构造函数中发生了阻塞,所有其他线程中对该类型的访问都会被阻塞。LZ的代码在静态构造函数中启动了新线程,新线程又试图访问当前类型,所以新线程要等到静态构造函数执行完毕才能继续执行。而LZ又不让静态构造函数退出,所以新线程就无法继续执行。为什么LZ的代码访问了当前类型呢?C#在编译lambda表达式的时候会把它编译为当前类型的一个函数,既然是当前类型的函数,执行这个函数当然就是对类型的访问。LZ可以试试,把线程要执行的代码定义在其他类型中,就不会出现这种情况了。
我在怀疑静态构造函数,但现用2005 用不连LAMbda表达式无法验证 不过同意9L
LZ可改成普通静态方法试试
Lambda产生的匿名函数,您说”C#在编译lambda表达式的时候会把它编译为当前类型的一个函数“,我记得不是这样,他是做了一个static的函数,和实例没有关系。(当然,如果你用到了实例里面的field,property,那么这个匿名函数会把实例的this传入,但是,匿名函数仍然是一个static函数)
我会尝试反汇编一下
Thread.Sleep(1000);
线程的启动和构造函数阻塞有关系?
可是我如果在ThreadProc里面加上 bEnd = true
即使阻塞也能跑啊。