C# 某一时刻如何让一个方法只被一个线程调用?
有好几个线程都要调用一个方法,怎么保证某一时间方法只被一个线程调用,其他线程等待,或者排队。比如thread1在调用方法A,thread2、thread3等待,等thre...
有好几个线程都要调用一个方法,怎么保证某一时间方法只被一个线程调用,其他线程等待,或者排队。
比如thread1在调用方法A,thread2、thread3等待,等thread1结束,线程2、3再有一个去调用方法A。
最好提供点代码,不懂线程排队的技术。 展开
比如thread1在调用方法A,thread2、thread3等待,等thread1结束,线程2、3再有一个去调用方法A。
最好提供点代码,不懂线程排队的技术。 展开
5个回答
展开全部
要同一时间使方法只受到一个线程访问只需加线程锁,例如:
void f()
{
lock(this)
{
// your code here
}
}
但是你说需要排队的话那是另外一个问题,因为线程竞争锁是没有序的,极端情况是,永远有一个线程争不到锁。
这时你需要一个队列,来保证你线程的请求是有序的!
例如:
List<Action> actions = new List<Action>();
actions.Add(()=>{/* your code here */});
...
另一线程就不断从这个队列内读取请求然后执行,这样必须执行方和使用方一起改动。
void f()
{
lock(this)
{
// your code here
}
}
但是你说需要排队的话那是另外一个问题,因为线程竞争锁是没有序的,极端情况是,永远有一个线程争不到锁。
这时你需要一个队列,来保证你线程的请求是有序的!
例如:
List<Action> actions = new List<Action>();
actions.Add(()=>{/* your code here */});
...
另一线程就不断从这个队列内读取请求然后执行,这样必须执行方和使用方一起改动。
展开全部
类似如下方式,假设函数名为a,应该能满足大部分的使用情景,并且只要不在到处使用lock(this), 这个方式也是安全的。
void a()
{
lock (this)
{
// 原来的函数内容放在这里
}
}
void a()
{
lock (this)
{
// 原来的函数内容放在这里
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
查一下Monitor.Enter的用法,如果涉及到顺序可以用AutoResetEvent
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
lock 关键字
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Lock锁,可以解决这个问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询