错误:对象当前正在其他地方使用
public partial class Form1 : Form { private object obj = new object(); Image imageLogin; // 登陆验证码图片 string imageCodeLogin; // 登陆验证码字符 Thread threadBuy; private void GetBuyThread() { threadBuy = new Thread(new ThreadStart(Start)); threadBuy.Name = "BuyThread"; threadBuy.Start(); } // 登录线程 private void Start() { Login(); } public void Login() { for (int i = 0; i < 10000; i++) { try { Stream stream= null; // 这里省略读取过程。 if (stream != null) { lock (obj) { // 读取并保存登录验证码 imageLogin = null; // 读取图片省略 Show(imageLogin); // 主线程输出图片省略 imageCodeLogin = null; // 识别验证码省略 } } } } }
出错的代码:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); // 这里会报错 }
或者这里:
public string Read(Bitmap bmp) { // 这里读取图片时 }
第一次用多线程,不知道怎么加锁,是不是锁加的地方不对?
你的问题我认为是:for (int i = 0; i < 10000; i++) 频繁锁的次数太多超出锁内部计数范围了造成的“对象当前正在其他地方使用”。
然后我来分析下你这段代码:
1、private object obj = new object();为实例成员,这样每个实例都会有自己的锁定对象。1楼说的加上static可以让
Form1的每个实例都共用一个obj加锁对象。不过这个只是锁定范围的问题,不是你说的“对象当前正在其他地方使用”
2、你这段代码threadBuy = new Thread(new ThreadStart(Start));只是new了一个线程,我不知道是不是你想要的循环多线程。代码设计上存在一个问题就是不必要的频繁加锁个释放,你完全可以这样写循环
lock (obj) { for (int i = 0; i < 10000; i++) { Stream stream= null; // 这里省略读取过程。 if (stream != null) { // 读取并保存登录验证码 imageLogin = null; // 读取图片省略 Show(imageLogin); // 主线程输出图片省略 imageCodeLogin = null; // 识别验证码省略 } } }
对锁想多了解下可以看看:http://www.cnblogs.com/heyuquan/archive/2012/12/31/2840214.html
锁对象 要固定,obj是实例对象是变化的,加static。
感谢了。
你锁定的对象一定要是引用的,静态的,只读的。 这样子的话,就可以解决你的问题了
感谢。
你把 Login 中多余的代码都注释掉,只留下 for() {lock (obj){Debug.WriteLine("");}},测试下。
我怀疑你的异常不是 lock(obj) 的问题,你应该把异常堆栈贴出来,找到抛出异常的语句。
其实和2楼说的一样,但我是看你的解决了问题的,简单测试后发现没出现错误了,继续感谢。
把锁加在for循环的外面。
依据但指出了关键。感谢。