关于两个不同进程互斥访问一个方法

mm1543 2009-06-24 09:23:04
进程A是由用户启动的进程,进程B是由作业调度到一定的时间自动启动的进程,进程A和B都要访问同一个webservice的服务,如何控制这两个进程才能使它们能够互斥访问这个服务的方法,谢谢!
...全文
271 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2011-08-10
  • 打赏
  • 举报
回复
线程是能用lock ,楼主问的是进程,进程能lock吗?
我也不 知道,今天在搜这方面的问题?
不过一楼的答案好像不错。
much0726 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhoufoxcn 的回复:]
mutex
lock
都是可以的。

lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

线程处理(C# 编程指南) 这节讨论了线程处理。

lock 关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit。

通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:

如果实例可以被公共访问,将出现 lock (this) 问题。

如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。

由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现 lock(“myLock”) 问题。

最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。

[/Quote]
很详细了,要点都讲的很清楚了,记得lock的效率是所有锁中最高的。但是用法比较简单,控制好,还是可以解决大部分问题了。
nosuchtracter 2009-06-28
  • 打赏
  • 举报
回复
建立一个object
lock(object)
mm1543 2009-06-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
用命名的Mutex对象。
[/Quote]

有名mutex:
static Mutex m;
private void WebMethod()
{
bool requestInitialOwnership = true;
bool mutexWasCreated;
m = new Mutex(requestInitialOwnership,
"MyMutex",
out mutexWasCreated);
if (!(requestInitialOwnership && mutexWasCreated))
{
Console.WriteLine("Waiting for the named mutex.");
.....
}
//do work
}

请问:A进程首次调用webservice方法WebMethod时,创建了mutex对象m,则mutexWasCreated为true,则直接进入do work代码段;
那么,如果A进程需要再次调用WebMethod方法,此时mutexWasCreated应该为false了,如果才能保证A进程可以反复调用WebMethod,而在A调用期间B进程一直阻塞呢?
也就是说我希望A和B是互斥的,但是A进程可以反复调用这个方法,谢谢了!
周公 2009-06-24
  • 打赏
  • 举报
回复
mutex
lock
都是可以的。

lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

线程处理(C# 编程指南) 这节讨论了线程处理。

lock 关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit。

通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:

如果实例可以被公共访问,将出现 lock (this) 问题。

如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。

由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现 lock(“myLock”) 问题。

最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。
cnzdgs 2009-06-24
  • 打赏
  • 举报
回复
用命名的Mutex对象。
MicroDeviser 2009-06-24
  • 打赏
  • 举报
回复
用lock()
mm1543 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jimh 的回复:]
在webservice上锁定就可以了,把webservice设置为单线程访问,创建互斥变量,自己控制锁定等等都可以实现。
[/Quote]

谢谢
那么是在webservice的类中创建static的mutex对象吗
这样的话岂不是只能控制同一个进程的不同线程间的互斥访问吗
jimh 2009-06-24
  • 打赏
  • 举报
回复
在webservice上锁定就可以了,把webservice设置为单线程访问,创建互斥变量,自己控制锁定等等都可以实现。
yuanhuiqiao 2009-06-24
  • 打赏
  • 举报
回复
lock (this)
{
....
}
mm1543 2009-06-24
  • 打赏
  • 举报
回复
给点示例代码吧......

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧