C#多线程 我要如何实现1秒执行一次A区代码 然后执行B区 然后在回去A 这样循环 200
4个回答
展开全部
编写桌面程序的时候当遇到长时间的方法调用时,大家都会遇到主线程被挂起、界面无响应的状况。线程操作是解决类似问题的绝佳手段,但对于刚接触线程的朋友来讲编写和调试多线程程序是非常痛苦的,尤其是在VC的MFC下,没有一定的C++基础,很难做出专业的多线程程序来。
幸好,.Net框架为我们提供了非常简便的方法和机制来创建多线程程序,譬如:Thread、线程池、异步方法调用以及BackgroundWorker!Thread和BackgroundWorker在MSDN中关于这两个类都有非常详细的解释以及丰富的示例,在后续的文章里我们会利用非常实际的示例程序来进行实战。在这里我们首先讨论异步方法调用。
所谓异步方法调用英文即为Asynchronous Method Invocation,讨论异步方法调用实际上就是讨论如何以非阻塞的方式来调用方法。常规的阻塞式方法调用例如:
//调用同一个耗时的方法
private void a()
{
Thread.Sleep(10000);
}
//阻塞式调用
private void button1_Click(object sender, EventArgs e)
{
a();
MessageBox.Show("button1_Click will return!");
}
当单击button1后,主界面立即失去响应,持续10s后会显示一个消息框报告button1_Click方法将要返回,这时a()方法已经调用结束并返回。这表明主线程是在按照button1_click->a()->button1_click的顺序依次执行代码,所有代码都在主线程中执行。
然后,我们在窗体上放置第二个button,即button2,来演示如何进行异步方法调用。.Net2.0提供了两种途径实现异步方法调用,每种途径实际上都是使用委托来实现。一种是简单的无参数传递的MethodInvoker委托类型,另一种是标准的delegate类型。MethodInvoker类型的委托不接受任何参数传递,而delegate类型的委托使用起来则相当灵活,并且可以传递任意类型的参数。我们主要以MethodInvoker为例,首先看一下button2_Click事件的内容:
//调用同一个耗时的方法
private void a()
{
Thread.Sleep(10000);
}
//异步方法调用
private MethodInvoker simpleDelegate1;
private void button2_Click(object sender, EventArgs e)
{
simpleDelegate1 = new MethodInvoker(a);
simpleDelegate1.BeginInvoke(null, null);
MessageBox.Show("button2_Click will return!");
}
当单击button2后,会立即显示一个消息框报告button1_Click方法将要返回,而主界面没有失去响应。这表明在主线程下的button2_click要返回了!而这时的a()方法正在另一个独立的线程上继续执行着,而且在执行的10s过程中,我们仍然可以随意拖动窗体、改变窗体大小、继续单击窗体上的按钮甚至关闭窗体。这种调用即称为异步方法调用。
使用c++的朋友都知道函数指针,其实.Net下的委托就是一个函数指针类型,在.Net下已经没有函数的概念了,所以也称为方法指针,只不过框架把一些东西隐藏了,我们不必关心细节,不必用指针的方式显示声明罢了。其实委托也可以同步阻塞的方式执行,你可以尝试将button2_Click中的代码:
simpleDelegate1.BeginInvoke(null, null);
更改为:
simpleDelegate1.Invoke();
其执行方式与button1_Click完全一样。
Invoke以同步方式开始执行委托,其参数必须与要执行的方法完全一致。BeginInvoke就是以异步方式开始执行委托,它与您需要执行的方法具有相同的参数,另外还有两个可选参数。在.Net下当你看到以Begin开头的方法时几乎都是以异步方式执行代码。而对应BeginInvoke的就是EndInvoke方法,EndInvoke的任务就是传递BeginInvoke的返回值,我们将在下一篇博文中详细介绍BeginInvoke和EndInvoke的使用,以及如何捕获异步方法调用的结束。
幸好,.Net框架为我们提供了非常简便的方法和机制来创建多线程程序,譬如:Thread、线程池、异步方法调用以及BackgroundWorker!Thread和BackgroundWorker在MSDN中关于这两个类都有非常详细的解释以及丰富的示例,在后续的文章里我们会利用非常实际的示例程序来进行实战。在这里我们首先讨论异步方法调用。
所谓异步方法调用英文即为Asynchronous Method Invocation,讨论异步方法调用实际上就是讨论如何以非阻塞的方式来调用方法。常规的阻塞式方法调用例如:
//调用同一个耗时的方法
private void a()
{
Thread.Sleep(10000);
}
//阻塞式调用
private void button1_Click(object sender, EventArgs e)
{
a();
MessageBox.Show("button1_Click will return!");
}
当单击button1后,主界面立即失去响应,持续10s后会显示一个消息框报告button1_Click方法将要返回,这时a()方法已经调用结束并返回。这表明主线程是在按照button1_click->a()->button1_click的顺序依次执行代码,所有代码都在主线程中执行。
然后,我们在窗体上放置第二个button,即button2,来演示如何进行异步方法调用。.Net2.0提供了两种途径实现异步方法调用,每种途径实际上都是使用委托来实现。一种是简单的无参数传递的MethodInvoker委托类型,另一种是标准的delegate类型。MethodInvoker类型的委托不接受任何参数传递,而delegate类型的委托使用起来则相当灵活,并且可以传递任意类型的参数。我们主要以MethodInvoker为例,首先看一下button2_Click事件的内容:
//调用同一个耗时的方法
private void a()
{
Thread.Sleep(10000);
}
//异步方法调用
private MethodInvoker simpleDelegate1;
private void button2_Click(object sender, EventArgs e)
{
simpleDelegate1 = new MethodInvoker(a);
simpleDelegate1.BeginInvoke(null, null);
MessageBox.Show("button2_Click will return!");
}
当单击button2后,会立即显示一个消息框报告button1_Click方法将要返回,而主界面没有失去响应。这表明在主线程下的button2_click要返回了!而这时的a()方法正在另一个独立的线程上继续执行着,而且在执行的10s过程中,我们仍然可以随意拖动窗体、改变窗体大小、继续单击窗体上的按钮甚至关闭窗体。这种调用即称为异步方法调用。
使用c++的朋友都知道函数指针,其实.Net下的委托就是一个函数指针类型,在.Net下已经没有函数的概念了,所以也称为方法指针,只不过框架把一些东西隐藏了,我们不必关心细节,不必用指针的方式显示声明罢了。其实委托也可以同步阻塞的方式执行,你可以尝试将button2_Click中的代码:
simpleDelegate1.BeginInvoke(null, null);
更改为:
simpleDelegate1.Invoke();
其执行方式与button1_Click完全一样。
Invoke以同步方式开始执行委托,其参数必须与要执行的方法完全一致。BeginInvoke就是以异步方式开始执行委托,它与您需要执行的方法具有相同的参数,另外还有两个可选参数。在.Net下当你看到以Begin开头的方法时几乎都是以异步方式执行代码。而对应BeginInvoke的就是EndInvoke方法,EndInvoke的任务就是传递BeginInvoke的返回值,我们将在下一篇博文中详细介绍BeginInvoke和EndInvoke的使用,以及如何捕获异步方法调用的结束。
展开全部
A里面 触发B B里面在触发A
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
lock不需要, Monitor需要手工控制。 实际上你用Reflector工具看源码就清楚了,lock就用用Monitor实现的。
追问
多线程不是ther...那个东东吗
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询