开不了的,线程X,在A里面特殊情况要等待执行了B之后,用户手动点下Button才能让线程X继续执行X,而且在此过程中要一直锁定B方法,不让其他线程访问。
解决方案 »
- 图像分割有没有做过
- 如何去掉dagrideview中行标题上的小三角符号?
- 求VS2005英文版下载地址?
- 开源一套我的系统:棋牌游戏大厅
- 请教各位朋友一个简单问题!
- 请教html文件转为txt文件的问题!
- 在线等待:请问各位高手Web.config和machine.config到底有什么不同,什么时候配置Web.config什么时候配置machine.config
- 在C#中listbox怎么用鼠标右键选中里边的项后,再弹出右键菜单。
- 怎么样改变一个Panal的位置?
- 怎样设置水晶报表的页面的大小啊,在线
- 紧急求解决方法数据库连接问题
- 请教基于Wince C#的学生移动考勤的项目开发,详见内容!!谢谢!!
void button()
{
run = true;
} void threadmethod()//线程委托函数
{
while (true)
{
while (run)
{
A();
}
thread.sleep(1000);
}
}
void A()
{
if (异常)
{
B();
F();
run = false;
return;
}
B();
}
自己瞎想的,不知如题不?
点击Button后作一判断,即是你后面所讲到的特殊情况。如果条件成立则就执行你本来的代码,如果条件不成立提示用户再次点击按钮,然后再执行你原有的代码。
IF(特殊情况)
B()
ELSE
B()
总之,B执行完就等按钮,不知道复杂在哪?
B()
ELSE
B()如果这个时候其他线程也进入B了呢?而且Button的click事件没促发怎么往下走?
private void button1_Click(object sender, EventArgs e)
{
if (allDone.WaitOne())//开始先不用看这个,看到最后我说的话在回过来看这句话
{ //这块就下叫做 Y 吧
allDone.Set();
}
//当一个button事件点击后,使用多线程去调用方法A,A方法执行完毕的时候会去调用方法B(所以我们可以认为A B 方法是在同一个线程里,也就是先执行A在执行B,我们可以把这2个方法放到方法C里,用一个线程去调用方法C,同样的效果,先调用A,A执行完之后再执行B)
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(C));
th.IsBackground = true;
th.Start();
}
private void C()
{
A();
B();
}
private void A()
{
if (true)//你说:就是在执行方法A的时候会有一种特殊情况F,然后线程暂停,(那好,当达到一定条件的时候A会先调用F,你想问线程暂停呢?别着急,往下看)
{
F();
}
}
private void B()
{
}
private void F()
{
//你说:这时候需要提前去 调用一次方法B(OK,没问题,因为你这个线程是需要暂停的,所以你不能再当前线程去调用方法B,所以在这我又开了一个新线程去调用方法B,th.Start()的时候就会去执行方法B了,暂停?往下看!)
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(B));
th.IsBackground = true;
th.Start(); allDone.WaitOne();//这句话就是让你的线程等待,暂停了 这句话先叫做 X//你说:等待Button事件,Button事件点击后线程才能继续执行方法A,然后方法A执行完毕后依然会去调用方法B,线程结束。
//这时候你在点击Button1的时候就会进入我开始提到的那个if 这次点击就是你说的等待Button事件,好,这次事件来了,进入if 因为 X 语句所以他会进入那个if语句,当执行了allDone.Set()这句话之后,之前暂停的线程会瞬间开启继续执行,F方法继续执行,因为A方法里面调用的F方法,而且他们又是同一个线程,所以F方法继续执行就是你说的这句话“Button事件点击后线程才能继续执行方法A”,这时候方法A执行完毕之后依然会去调用你的方法B,这就是你说的“然后方法A执行完毕后依然会去调用方法B,线程结束。”
}
public class threadA
{
private threadB = new threadB;
private Thread a = null;
public threadA
{
a = new Thread(new ThreadStar(Start));
}
public void Start
while(thradB.WaitStatus = WaitStatus.WaitB)
{
lock(WaitStatus)
{
lock(threadB.lockObj)
{
//....
}
}
}threadF code}
public class threadB
{
private Thread b = null;
public static object lockObj = new object();
public threadB()
{
lock(lockObj)
{
b = new Thread(new ThreadStart(dddd));
}
}
}
public class threadF
{
public threadF()
{
while(thradB.WaitStatus = WaitStatus.None)
{
}
}
public class common
{
public WaitStatus WaitStatus = WaitStatus.None;
}
public enum WaitStatus
{
None, WaitF, WaitB
}我的思路是:提供一个公共静态变量来表示锁定状态,在要访问B的线程里加上
while(现在!=状态.None)
{
Thread.Sleep(200);
}
知道B的锁定状态被解除,即其他对象访问放里以后才能继续访问。
{
private threadB = new threadB;
private Thread a = null;
public threadA
{
a = new Thread(new ThreadStar(Start));
}
public void Start
while(common.WaitStatus == WaitStatus.WaitB)
{
lock(common.WaitStatus)
{
lock(threadB.lockObj)
{
//....
}common.WaitStatus = WaitStatus.None;
}
}//threadF code}
public class threadB
{
private Thread b = null;
public static object lockObj = new object();
public threadB()
{b = new Thread(new ThreadStart(dddd));}
}
public class threadF
{
public threadF()
{
while(thradB.WaitStatus = WaitStatus.None)
{
}
}
public class common
{
public WaitStatus WaitStatus = WaitStatus.None;
}
public enum WaitStatus
{
None, WaitF, WaitB
}