本文介绍了线程和管理锁中的锁问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在注释区域挂起表单"中的这段代码中有问题
我的程序会挂在那里!!!有什么问题吗?
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);
}
}
}
推荐答案
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);
}
}
}
}
这篇关于线程和管理锁中的锁问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!