当前位置:编程学习 > C#/ASP.NET >>

c#怎么锁住一个方法

是这样的,我启动了几百异步委托,每个异步委托都是1个线程,异步委托的每个线程执行完毕后都会执行一个我指定的方法,就是判断当初启动的线程总数是否等于返回的线程,如果相等,就说明所有的线程都执行完毕并返回,于是执行if里面的方法,关键是N多线程同时判断线程总数是否等于返回线程,肯定有1个时间段是相等的,我想只要1个线程执行if里的方法,但是结果不尽人意,N多线程同时执行了if(启动线程总数==返回的线程总数)里的方法,造成不好的后果,所以我希望能够把这个方法同步,同一时间,只有1个线程可以执行该方法,或者改代码.望大神指教 --------------------编程问答-------------------- lock 

老虎传送门
搜索引擎:Bing
关键字:lock C#  --------------------编程问答-------------------- 用Task类吧,
Task有一个方法是在所有的Task都完成之后,再去执行一个方法。
如果还是想用你自己的方法
则可以定义一个类变量。
object syncLocker = new object();

然后在if()判断的时候,在外面加上Lock


lock(syncLocker)
{
    if(启动线程总数==返回的线程总数)
        ....你的代码。
}

这样就Ok了。 --------------------编程问答-------------------- 你需要了解线程同步的内容,即保证方法只运行一个线程执行,这个文章应该可以帮助到你:http://www.cnblogs.com/zhili/archive/2012/07/21/ThreadsSynchronous.html
--------------------编程问答-------------------- lock ... --------------------编程问答-------------------- 应该是用 AutoResetEvent。你的那个判断太原始了,而且因为原始(而又想有基本的安全性)所以繁琐的境地。 --------------------编程问答--------------------
引用 1 楼 mmm306306 的回复:
lock 

老虎传送门
搜索引擎:Bing
关键字:lock C# 


lock不能锁住基本类型,所以我才要锁方法 --------------------编程问答--------------------
引用 2 楼 Linux7985 的回复:
用Task类吧,
Task有一个方法是在所有的Task都完成之后,再去执行一个方法。
如果还是想用你自己的方法
则可以定义一个类变量。
object syncLocker = new object();

然后在if()判断的时候,在外面加上Lock


lock(syncLocker)
{
    if(启动线程总数==返回的线程总数)
        ....你的代码。
}

这样就Ok了。


这个方法之前已经试过了其实,但是还是会有N多线程进入if里面 --------------------编程问答--------------------
引用 5 楼 sp1234 的回复:
应该是用 AutoResetEvent。你的那个判断太原始了,而且因为原始(而又想有基本的安全性)所以繁琐的境地。

我是异步委托不是线程 --------------------编程问答--------------------
引用 8 楼 threadroc 的回复:
Quote: 引用 5 楼 sp1234 的回复:

应该是用 AutoResetEvent。你的那个判断太原始了,而且因为原始(而又想有基本的安全性)所以繁琐的境地。

我是异步委托不是线程

你还是先去看看什么是异步委托吧。。 --------------------编程问答--------------------
引用 9 楼 guyuekkk11 的回复:
Quote: 引用 8 楼 threadroc 的回复:

Quote: 引用 5 楼 sp1234 的回复:

应该是用 AutoResetEvent。你的那个判断太原始了,而且因为原始(而又想有基本的安全性)所以繁琐的境地。

我是异步委托不是线程

你还是先去看看什么是异步委托吧。。

我知道异步委托是启动一个线程,但是异步委托可以调用线程的方法吗? --------------------编程问答--------------------
引用 9 楼 guyuekkk11 的回复:
Quote: 引用 8 楼 threadroc 的回复:

Quote: 引用 5 楼 sp1234 的回复:

应该是用 AutoResetEvent。你的那个判断太原始了,而且因为原始(而又想有基本的安全性)所以繁琐的境地。

我是异步委托不是线程

你还是先去看看什么是异步委托吧。。


问题所在是,我这方法所有的线程都会执行,我应该用哪1个线程来wait,应该用哪一个线程set发信号
总不能我把需要同步的代码前加上wait,然后所有的线程进入全部wait了,没有其他线程给他set,然后线程全部死了...
我看到他们的案例是,1个主线程给其子线程set,但是我这个不能用主线程set,求解释.谢谢 --------------------编程问答-------------------- 1.最好能贴出代码,这样容易分析,需求毕竟还是比较笼统
2.单看需求,你是想用最后一个执行完的执行对应方法。但异步之间不能确定哪个是最后一个完成(我知道的比较少),如果是"最后一个",只能用同步的方法才能确定吧。我觉得线程同步不会满足你的要求,而且比较损失性能。 --------------------编程问答--------------------
引用 7 楼 threadroc 的回复:
Quote: 引用 2 楼 Linux7985 的回复:

用Task类吧,
Task有一个方法是在所有的Task都完成之后,再去执行一个方法。
如果还是想用你自己的方法
则可以定义一个类变量。
object syncLocker = new object();

然后在if()判断的时候,在外面加上Lock


lock(syncLocker)
{
    if(启动线程总数==返回的线程总数)
        ....你的代码。
}

这样就Ok了。


这个方法之前已经试过了其实,但是还是会有N多线程进入if里面


那是你的代码有Bug, 你这个If的条件,理论应该只有一个是成立的。你的代码写的肯定有问题。 --------------------编程问答--------------------
class HelloFriend{
System.out.println("你好,朋友!");
}
--------------------编程问答--------------------
引用 7 楼 threadroc 的回复:
Quote: 引用 2 楼 Linux7985 的回复:

用Task类吧,
Task有一个方法是在所有的Task都完成之后,再去执行一个方法。
如果还是想用你自己的方法
则可以定义一个类变量。
object syncLocker = new object();

然后在if()判断的时候,在外面加上Lock


lock(syncLocker)
{
    if(启动线程总数==返回的线程总数)
        ....你的代码。
}

这样就Ok了。


这个方法之前已经试过了其实,但是还是会有N多线程进入if里面


你在什么地方累加返回的线程总数? 这个总数累加的时候,也是要加Lock的。 --------------------编程问答--------------------
引用 15 楼 Linux7985 的回复:
Quote: 引用 7 楼 threadroc 的回复:

Quote: 引用 2 楼 Linux7985 的回复:

用Task类吧,
Task有一个方法是在所有的Task都完成之后,再去执行一个方法。
如果还是想用你自己的方法
则可以定义一个类变量。
object syncLocker = new object();

然后在if()判断的时候,在外面加上Lock


lock(syncLocker)
{
    if(启动线程总数==返回的线程总数)
        ....你的代码。
}

这样就Ok了。


这个方法之前已经试过了其实,但是还是会有N多线程进入if里面


你在什么地方累加返回的线程总数? 这个总数累加的时候,也是要加Lock的。


已经解决了,原来我lock的不是全局变量 --------------------编程问答-------------------- 每个线程定义一个Key,缓存起来,当线程执行完毕以后把线程的Key值传递到你的方法中去,
根据Key在缓存中查找对应的线程。 --------------------编程问答--------------------
引用 16 楼 threadroc 的回复:
Quote: 引用 15 楼 Linux7985 的回复:

Quote: 引用 7 楼 threadroc 的回复:

Quote: 引用 2 楼 Linux7985 的回复:

用Task类吧,
Task有一个方法是在所有的Task都完成之后,再去执行一个方法。
如果还是想用你自己的方法
则可以定义一个类变量。
object syncLocker = new object();

然后在if()判断的时候,在外面加上Lock


lock(syncLocker)
{
    if(启动线程总数==返回的线程总数)
        ....你的代码。
}

这样就Ok了。


这个方法之前已经试过了其实,但是还是会有N多线程进入if里面


你在什么地方累加返回的线程总数? 这个总数累加的时候,也是要加Lock的。


已经解决了,原来我lock的不是全局变量


难道 以前的代码 ,每次lock之前的时候都new一个新的锁对象??
--------------------编程问答-------------------- 要锁的代码放到一个类里面操作就行了。 --------------------编程问答-------------------- 看一下答案 不就是锁吗?? --------------------编程问答-------------------- 这么简单的问题回答的人好多啊
--------------------编程问答-------------------- 除 --------------------编程问答-------------------- 不懂,来学习的!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,