错误:对象当前正在其他地方使用
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循环的外面。
依据但指出了关键。感谢。