问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c# 异步线程操作

发布网友 发布时间:2022-05-08 11:37

我来回答

3个回答

热心网友 时间:2022-04-26 15:44

我觉得你对线程的理解还是不够的!如果我没有猜错,其实你只要的只是一个异步操作或是线程而已。
首先你先搞清几个概念: 委托/异步/事件/线程,这几个概念搞清楚了这后再来想线程的同步与异步的问题。
委托,这个是非常简单的概念,其实就是类似于C/C++中的函数指针而已,为了你更好的理解,你可以认为委托其实就是把成员方法参数化,然后可以把成员方法作为参数一样在其他成员方法中做为参数传入——这样你就可以理解什么是委托了。
异步,这个也非常简单,比如某个业务逻辑中要执行某个方法,而这个方法正常的情况下是执行出结果之后,代码才可以向下执行,这是同步,而异步时,这个成员方法并没有立即返回结果,程序则会继承向下执行,直接需要结果时进行堵塞等待异步方法的完成。问题在于你其实并不知道这个异步方法什么时候开始的,它的实现原理其实就是一个后台线程完成的。并将结果保存在IAsynResult中,等待你使用。
事件其实是一种特殊的委托!仅此而已,这个更好理解,它的实现是在类内部形成一个多播委托,程序在使用时可能通过事件句柄,绑定要执行的事件。
线程,这个当然就是一个线程的开辟,让多线程的机器同步执行,当然这个是由底层系统决定的,至于什么时候执行什么时候完成你完成不知道!
现在来看你的需求,你要执行的内容可能是不想影响其他程序运行的,如果任务只有一次,那么事件驱动对于你来说是绝对是正确的(但问题是我见过好多程序员,写类时只会写字段/属性/成员方法/索引器,他们并没有写过委托或事件,其实一个类是可以包含事件的,根据业务逻辑的分析,以事件驱动有时对于我们的业务来说是非常简单的,不会在类中定义事件的程序员绝对不是什么高手的)。
或者你的业务逻辑与本身类没有任何的关系或是较为松散,根据面向对象设计原理的话你不知道你的程序该放在哪个类下,或者他不属于任何类(面向对象的设计核心就是高内聚低耦合),那么这个业务可能是一个流业务或模块业务,那么此时,你应该开辟一个线程,线程中执行一个类的成员方法,然后使用事件驱动的方式思考这个问题,使用委托去修改界面中的属性值(松耦合的方式),这样才会达到较好的效果。
线程的同步与异步指的是线程间的调度的概念,与你的需求其实没有相关性的。而且你的需要描述的并不十分清楚,无法确定你到是需要异步/事件/线程。但是就线程本身来说,它与主线程(创建线程)之间其实没有关系的,所以不存在所谓与主线程之间的“异步/同步”关系。
比如:
Thread t = new Thread(new ThreadStart(MethodA));
t.start(); // 一定要知道,这个只是启动线程,实现上只是向系统注册,它只是相当于告诉系统,线程可以开始运行了,至于什么什么运行那要看系统了,并不是线程开始运行。
// other code in here;
t.Join(); // 当前线程(主线程进入阻塞,等待线程的完成
上边的例子中,t中其实是将一个委托给了线程,t.start()告诉线程线程可以开始了。
然后没有任何其他的等待,直接进入other code的运行。直到t.Join();则会阻击主线程,直到t线程完成后,代码才会向下执行。所以基本上来说,你不知道t中的代码还是other code谁先执行!这就是线程(其实线程要求的委托MethodA只是一种简写的形式必须是void返回值的)!异步其实也是这个道理,基本上根这个一模一样,只不过它是看起来是一个方法,实现也被系统封闭成了线程,但他会返回结果,所以异步方法使用IAsynResult或存放结果,直接你使用这个结果时,也会发生阻塞,等待异步的完成!
而事件则是一个多播的委托,做为一个接口开放,外部程序通过委托的方式绑定到多播委托上,你可以理解事件句柄其实是一个list列表,列表中存放的是一系列的委托,按照进入顺序(绑定)执行外部其些程序片段。所以事件一个的方法都是要带上事件源,事件参数两个参数的,如: public void XXXEvent(object sender, EventArgs e);其中sender就是事件源,而e就是该事件的参数。
事实上,菊花琏查询是一种比较耗时的操作,所以一般考虑事件进行驱动,比如某个类对象的成员执行完成时,向外提供一个OnCompleted的事件,那么,外部程序直接编写这个事件的,显然不再耗时。或者使用阻塞机制,让主线程等待子线程的完成。正是因为你这里说不清楚这一点儿的场景使用规则,所以无法判定你应该使用异步/事件驱动还是多线程。追问您好,非常感谢您的耐心回答,看了您的回答,我如洪湖灌顶般,就您的回答来看,我应该是需要写一个事件进行驱动,但是因为我这是无线循环的方法,故不清楚我该如何实现?

热心网友 时间:2022-04-26 17:02

直接上伪代码:

//在main函数或其他方法里面启动线程:
Thread t = new Thread(耗时操作方法名);
t.Start();

void 耗时操作方法名()
{
    //...
    this.Invoke((MethodInvoker)delegate
                {
                    //更新界面的操作
                });
    Sleep(1000);
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
一般的高低床长宽多少 家用高低床尺寸一般是多少 学校高低床尺寸是多少 一般学生高低床是多少尺寸 高低床多少钱? CSGO刀和手套哪个先买?CSGO刀和手套出的概率一样吗? ...高考分是463,我有机会上西北民族大学或者是北方民族大学么?很急... 我是csgo的一个萌新想要氪一把刀求大佬推荐一款500到700的刀 您好,我的分数是437可以报预科兰州西北民族大学吗? CSGO的刀为什么这么贵?CSGO的刀会慢慢磨损吗? springmvc怎样异步处理 c# 异步的几个问题请教。 JS中的异步操作有哪些 单线程的AS3是如何处理异步事件的 什么是 异步事件? 如何理解异步事件? 2019款大众朗逸,合资紧凑型家用轿车,性价比很高 2019款两箱朗逸豪华版落地价多少钱 新一代大众朗逸两厢版实车怎么样? 大众朗逸两厢车和三厢车哪个好?哪个更经济实惠呢? 2019款大众朗逸1.4T哪些颜色内饰是纯色的 13万多元大众朗逸两厢版,少了“屁股”后,还招人喜欢吗? 朗逸两厢好还是三厢好?有什么区别? 大众朗逸1.4t舒适版是几箱车 朗逸有两厢车吗 朗逸是几厢车 埃罗芒阿老师中男主说了句像多惊喜大搞事呀的日文是哪集哪分钟 这几个日文是什么意思? 埃罗芒森塞什么意思? 麦罗芒阿日语什么意思,艾罗芒阿老师喜欢谁,艾果芒 jquery 点击事件 异步点击 不生效 JSP页面中什么叫叫异步请求??? 苹果云相册里的照片怎么删除 成人教育,分业余和函授,两者的区别是什么? vivo手机正在安装怎么将这个软件给删掉 电脑显示GIGABYTE Insist on UItra durable开不了机,怎么办?按了Ta_百度问一问 gigabyte界面无法开机怎么办? 请问为什么burberry 国外官网的价格比中国官网价格低那么多啊? Burberry男士香水柑橘调,在天猫买是正品吗?在天猫旗舰店30ml要300多 ... 美国代购burberry羊角扣大衣4500靠谱么 在网上看到了巴宝莉的男款钱包 一千多保证正品 说是香港代购 以前听朋友说 便宜的 都是a货,一千多 burberry的领带 让朋友的朋友代购来的 请鉴定一下真假!! 第一张是标牌 也没有网上说的钢印 开锁,修锁,换锁多少钱 深圳修锁一般多少钱 徐州开锁多少钱? 钥匙断在锁里了,找开锁公司要多少钱 大哥,这个是信息系统的。我要的是系统集成项目管理工程师的视频教程。 应聘销售行业 怎样自我介绍? vivo账号密码忘了怎么办? 哪家软件公司的电子制造业erp软件比较好用呢?