锁定线程和管理锁定的问题

时间:2011-02-06 11:28:38

标签: thread-safety

我在评论区域“悬挂表单”

中的此代码中存在问题

我的节目会挂在那里!!!!什么是问题?

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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

Invoke等待函数返回。 UI线程将运行循环几分钟,工作线程将等待UI线程调用并返回。

使用BeginInvoke将任务放在UI线程上而不会阻塞。