首页 新闻 会员 周边 捐助

多线程 锁 对象当前正在其他地方使用

0
悬赏园豆:50 [已解决问题] 解决于 2013-01-11 11:24

错误:对象当前正在其他地方使用

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)
{
    // 这里读取图片时
}

第一次用多线程,不知道怎么加锁,是不是锁加的地方不对?

sanmi的主页 sanmi | 初学一级 | 园豆:73
提问于:2013-01-10 13:41
< >
分享
最佳答案
0

你的问题我认为是: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





收获园豆:10
滴答的雨 | 老鸟四级 |园豆:3660 | 2013-01-10 14:11
其他回答(4)
0

锁对象 要固定,obj是实例对象是变化的,加static。

 

收获园豆:10
Qlin | 园豆:2403 (老鸟四级) | 2013-01-10 13:54

感谢了。

支持(0) 反对(0) sanmi | 园豆:73 (初学一级) | 2013-01-11 11:15
0

你锁定的对象一定要是引用的,静态的,只读的。 这样子的话,就可以解决你的问题了

收获园豆:10
chenping2008 | 园豆:9836 (大侠五级) | 2013-01-10 15:37

感谢。

支持(0) 反对(0) sanmi | 园豆:73 (初学一级) | 2013-01-11 11:17
0

你把 Login 中多余的代码都注释掉,只留下 for() {lock (obj){Debug.WriteLine("");}},测试下。

我怀疑你的异常不是 lock(obj) 的问题,你应该把异常堆栈贴出来,找到抛出异常的语句。

收获园豆:10
Launcher | 园豆:45050 (高人七级) | 2013-01-10 16:54

其实和2楼说的一样,但我是看你的解决了问题的,简单测试后发现没出现错误了,继续感谢。

支持(0) 反对(0) sanmi | 园豆:73 (初学一级) | 2013-01-11 11:23
0

把锁加在for循环的外面。

收获园豆:10
angelshelter | 园豆:9914 (大侠五级) | 2013-01-10 20:21

依据但指出了关键。感谢。

支持(0) 反对(0) sanmi | 园豆:73 (初学一级) | 2013-01-11 11:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册