线程和管理锁中的锁问题 [英] problem with lock in thread &managment lock

查看:76
本文介绍了线程和管理锁中的锁问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在注释区域挂起表单"中的这段代码中有问题

我的程序会挂在那里!!!有什么问题吗?

i have problem in this code in the comment area "hang the form"

my program will hang there!!!! what is problem??

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication28
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        BackgroundWorker backgw = new BackgroundWorker();
        private void button1_Click(object sender, EventArgs e)          
        {

            backgw.DoWork += new DoWorkEventHandler(k_DoWork);         
          
            ParameterizedThreadStart start = new ParameterizedThreadStart(startthread);
            System.Threading.Thread u;                                                         
            int i = 0;
            while (i < 100)
            {
                //u = new System.Threading.Thread(start);
                //u.Start(i);                                   //1.with thread way

                backgw.RunWorkerAsync(i);                       //2.with backgw way
                
                Thread.Sleep(1000);

                lock (y)
                {
                    Thread.Sleep(1000);
                }
                lock(h)
                i++;
            }
        }

        delegate void j(int h);
        j b;

        object h = new object();
        object y = new object();

        void startthread(object m)
        {
            Monitor.Enter(h);
            Monitor.Enter(y);
            p1((int)m); 
           
            Monitor.Exit(h);
        }

        void p1(int h)
        {
                b = delegate(int q)
                {
                    label1.Text = string.Format("Step is :{0}", h.ToString());
                };
                Monitor.Exit(y);          
                label1.Invoke(b);       //hang the form????
        }

        void k_DoWork(object sender, DoWorkEventArgs e)
        {

            Monitor.Enter(h);
            Monitor.Enter(y);
            p1((int)e.Argument);
            Monitor.Exit(h);
        }
    }
}

推荐答案


我怀疑情况有些僵局

i suspect some deadlock like situation


我使用此代码我认为是正确的.

i use of this code i thinking correct.

using System;
using System.Threading;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication37
{
    public partial class Form1 : Form
    {
        public delegate void MyDelegate(int o);
        MyDelegate myDelegate;
        IAsyncResult j;
        object a = new object();


        void RunInThread(object u)
        {
            Monitor.Enter(this);
            Thread.Sleep(100);

            myDelegate = delegate(int b)
            {
                label1.Text = u.ToString();
                Thread.Sleep(10);
            };

            j = this.BeginInvoke(myDelegate, (int)u);
            //MessageBox.Show("Hello");

            //Add your code that needs to be executed in separate thread 
            //except UI updation
            Monitor.Exit(this);

        }

        void AddControl(int r)
        {
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int i = 0;
            while (i < 100)
            {

                Thread.CurrentThread.Priority = ThreadPriority.Lowest;
                Thread t = new Thread(new ParameterizedThreadStart(RunInThread));

                t.Start(i);
                Thread.Sleep(10);

                Monitor.Enter(this);
                EndInvoke(j);
                label1.Invalidate();
                i++;
                
                Monitor.Exit(this);
            }
        }
    }
}


这篇关于线程和管理锁中的锁问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆