C#多线程 我要如何实现1秒执行一次A区代码 然后执行B区 然后在回去A 这样循环 200

 我来答
百度网友d451f9d
2019-02-20 · TA获得超过160个赞
知道答主
回答量:81
采纳率:27%
帮助的人:16.6万
展开全部
编写桌面程序的时候当遇到长时间的方法调用时,大家都会遇到主线程被挂起、界面无响应的状况。线程操作是解决类似问题的绝佳手段,但对于刚接触线程的朋友来讲编写和调试多线程程序是非常痛苦的,尤其是在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的使用,以及如何捕获异步方法调用的结束。
追问

我这个是用定时器 但是好卡啊 有什么办法嘛
百度网友3556686
2019-02-20 · TA获得超过187个赞
知道小有建树答主
回答量:475
采纳率:0%
帮助的人:23.8万
展开全部
void A(){ pulse = new System.Timers.Timer(); pulse.Interval = 1000; pulse.Elapsed += new System.Timers.ElapsedEventHandler(B); p
追问

我这样可以实现 但是好卡
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友677d12e
2019-02-20 · TA获得超过2488个赞
知道小有建树答主
回答量:1806
采纳率:63%
帮助的人:301万
展开全部
A里面 触发B B里面在触发A
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
l7722526
2019-02-20 · TA获得超过2.7万个赞
知道大有可为答主
回答量:2.8万
采纳率:84%
帮助的人:3616万
展开全部
lock不需要, Monitor需要手工控制。 实际上你用Reflector工具看源码就清楚了,lock就用用Monitor实现的。
追问
多线程不是ther...那个东东吗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式