开发者

problem with lock in thread &managment lock

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(100开发者_开发技巧0);
                }
                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);
        }
    }
}


Invoke waits for the function to return. The UI thread will be running the loop for a few minutes, the worker thread will be waiting for the UI thread to invoke and return.

Use BeginInvoke to put the task on the UI thread without blocking.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜