C#多线程(四)

一、基于事件的异步模型(Event-Based Asynchronous   EBA)

EAP提供了一个简单的方式来使用多线程编程,提供了多线程能力的同时而不用显式的打开或者管理线程。同时提供了一个取消模型,可以安全的更新WPF和WindowsFormsControl的属性。

EAP只是一个模型,这些特性必须要采用实际的代码来实现。在.NET Framework中最明显的就是BackgroundWorker类、WebClient类等。这些类中的方法以*Async结尾的犯法就是异步执行的:它们新打开一个线程,将结果返回给调用的方法,当执行完毕之后调用以*Completed结尾的方法来处理,这个方法会自动调用Invoke方法(WPF和WindowForms中)。

二、BackgroundWorker类

这是一个System.ComponentModel命名空间中的辅助类,这是一个一般意义上EAP模型的实现。这个类使用了线程池,因此不能调用Abort方法。

1、使用BackgroundWorker

首先实例化一个BackgroundWorker类的对象,并且调用DoWork方法调用RunWorkerAsync方法,可以提供一个对象类型的参数
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static BackgroundWorker _bw = new BackgroundWorker();
static void Main()
{
  _bw.DoWork += bw_DoWork;
  _bw.RunWorkerAsync ( "Message to worker" );
  Console.ReadLine();
}
static void bw_DoWork (object sender, DoWorkEventArgs e)
{
  // This is called on the worker thread
  Console.WriteLine (e.Argument);        // writes "Message to worker"
  // Perform time-consuming task...
}
RunWorkerAsync方法将参数总是传递给DoWork方法。同时在DoWork方法执行完毕之后,有一个RunWorkerCompleted事件,来处理执行完毕之后的动作。 支持进度报告:需要设置 WorkerReportsProgress 属性为true,同时周期性的在DoWork中调用 ReportProgress 方法,然后还要处理 ProgressChanged 事件,通过它的事件参数的属性 ProgressPercentage来实现。ProgressChanged事件中的代码可以自由的与UI控件进行交互,对更新进度条尤为有用。支持退出报告:设置WorkerSupportsCancellation属性为true;在DoWork中周期地检查CancellationPending属性:如果为true,就设置事件参数的Cancel属性为true,然后返回。(工作线程可能会设置Cancel为true,并且不通过CancellationPending进行提示——如果判定工作太过困难并且它不能继续运行);调用CancelAsync来请求退出

2、使用BackgroundWorker实现子类

这个类不是密封类,当写一个很耗时的方法时,使用一个返回BackgroundWorker子类的方法来实现,预配置完成异步的工作,只要处理RunWorkerCompleted事件和ProgressChanged事件。

三、定时器

周期性的执行某个方法最简单的方法就是使用一个计时器,比如System.Threading 命名空间下Timer类。线程计时器利用了线程池,允许多个计时器被创建而没有额外的线程开销。 Timer 算是相当简易的类,它有一个构造器和两个方法(这对于极简主义者来说是最高兴不过的了)。

?
1
2
3
4
5
6
7
8
9
public sealed class Timer : MarshalByRefObject, IDisposable
{
  public Timer (TimerCallback tick, object state, 1st, subsequent);
  public bool Change (1st, subsequent);   // To change the interval
  public void Dispose();                // To kill the timer
}
1st = time to the first tick in milliseconds or a TimeSpan
subsequent = subsequent intervals in milliseconds or a TimeSpan
(use Timeout.Infinite for a one-off callback)

接下来这个例子,计时器5秒钟之后调用了Tick 的方法,它写"tick...",然后每秒写一个,直到用户敲 Enter:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Threading;
 
class Program {
  static void Main() {
    Timer tmr = new Timer (Tick, "tick..." , 5000 , 1000 );
    Console.ReadLine();
    tmr.Dispose();         // End the timer
  }
 
  static void Tick (object data) {
    // This runs on a pooled thread
    Console.WriteLine (data);          // Writes "tick..."
  }
}

     .NET framework在System.Timers命名空间下提供了另一个计时器类。它完全包装自System.Threading.Timer,在使用相同的线程池时提供了额外的便利——相同的底层引擎。下面是增加的特性的摘要:

  • 实现了Component,允许它被放置到Visual Studio设计器中
  • Interval属性代替了Change方法
  • Elapsed 事件代替了callback委托
  • Enabled属性开始或暂停计时器
  • 提够Start 和 Stop方法,万一对Enabled感到迷惑
  • AutoReset标志来指示是否循环(默认为true)

    例子:

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    using System;

    using System.Timers;   // Timers namespace rather than Threading

     

    class SystemTimer {

      static void Main() {

        Timer tmr = new Timer();       // Doesn't require any args

        tmr.Interval = 500;

        tmr.Elapsed += tmr_Elapsed;    // Uses an event instead of a delegate

        tmr.Start();                   // Start the timer

        Console.ReadLine();

        tmr.Stop();                    // Pause the timer

        Console.ReadLine();

        tmr.Start();                   // Resume the timer

        Console.ReadLine();

        tmr.Dispose();                 // Permanently stop the timer

      }

     

      static void tmr_Elapsed (object sender, EventArgs e) {

        Console.WriteLine ("Tick");

      }

    }



     

          .NET framework 还提供了第三个计时器——在System.Windows.Forms 命名空间下。虽然类似于System.Timers.Timer 的接口,但功能特性上有根本的不同。一个Windows Forms 计时器不能使用线程池,代替为总是在最初创建它的线程上触发 "Tick"事件。假定这是主线程——负责实例化所有Windows Forms程序中的forms和控件,计时器的事件能够操作forms和控件而不违反线程安全——或者强加单元线程模式。Control.Invoke是不需要的。它实质上是一个单线程timer

          Windows Forms计时器必须迅速地执行来更新用户接口。迅速地执行是非常重要的,因为Tick事件被主线程调用,如果它有停顿, 将使用户接口变的没有响应。

    四、 局部存储

          每个线程与其它线程数据存储是隔离的,这对于“不相干的区域”的存储是有益的,它支持执行路径的基础结构,如通信,事务和安全令牌。 通过方法参数传递这些数据是十分笨拙的。存储这些数据到静态域意味着这些数据可以被所有线程共享。

    Thread.GetData从一个线程的隔离数据中读,Thread.SetData 写入数据。 两个方法需要一个LocalDataStoreSlot对象来识别内存槽——这包装自一个内存槽的名称的字符串,这个名称 你可以跨所有的线程使用,它们将得到不各自的值,看这个例子:

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    class ... {

        // 相同的LocalDataStoreSlot 对象可以用于跨所有线程

      LocalDataStoreSlot secSlot = Thread.GetNamedDataSlot  ("securityLevel");

        // 这个属性每个线程有不同的值

        int SecurityLevel {

        get {

            object data = Thread.GetData (secSlot);

            return data == null ? 0 : (int) data;    // null == 未初始化

           }

        set {

            Thread.SetData (secSlot, value);

            }

      }



     

    Thread.FreeNamedDataSlot将释放给定的数据槽,它跨所有的线程——但只有一次,当所有相同名字LocalDataStoreSlot对象作为垃圾被回收时退出作用域时发生。这确保了线程不得到数据槽从它们的脚底下撤出——也保持了引用适当的使用之中的LocalDataStoreSlot对象。

 

 

http://xwoislfr.blog.com
http://efbtdpp.blog.com
http://bwtzfc.blog.com
http://annxmevn.blog.com
http://hkjojn.blog.com
http://ezfdzjn.blog.com
http://ugbcaya.blog.com
http://oxgqaxg.blog.com
http://avgdibt.blog.com
http://ermeiz.blog.com
http://oosjzs.blog.com
http://ztrmhut.blog.com
http://wxluju.blog.com
http://uhjblp.blog.com
http://zphxwwc.blog.com
http://adhxhxk.blog.com
http://ejujrn.blog.com
http://tvwqspe.blog.com
http://siknktw.blog.com
http://ysbamnj.blog.com
http://xwlawi.blog.com
http://qjoxfywf.blog.com
http://xkbybzf.blog.com
http://qhajxak.blog.com
http://jeuxdinm.blog.com
http://nimjnl.blog.com
http://lpgemk.blog.com
http://wcvjio.blog.com
http://qukktgs.blog.com
http://jsdvht.blog.com
http://qybqnjp.blog.com
http://ztnpquxm.blog.com
http://xvehjot.blog.com
http://lzulgmf.blog.com
http://wtnwwop.blog.com
http://msidxl.blog.com
http://jthxql.blog.com
http://ceedji.blog.com
http://wvjrki.blog.com
http://fbkzccth.blog.com
http://jgzmqom.blog.com
http://ckrrdcma.blog.com
http://ctxgdax.blog.com
http://dbgprh.blog.com
http://ixqlcl.blog.com
http://cmrfzojh.blog.com
http://yqxriop.blog.com
http://tgeadgsb.blog.com
http://oqvoxykn.blog.com
http://ycygzxcb.blog.com
http://qfmrbhn.blog.com
http://olisiq.blog.com
http://ejyggvq.blog.com
http://icsfuqc.blog.com
http://sldweec.blog.com
http://ioolcce.blog.com
http://gvagbaj.blog.com
http://pukscz.blog.com
http://ztpdygp.blog.com
http://fcunlaz.blog.com
http://qywceuf.blog.com
http://hibksu.blog.com
http://bioxeb.blog.com
http://ofiegww.blog.com
http://hkavgksl.blog.com
http://vfzyrnrf.blog.com
http://betuuduj.blog.com
http://mjimyc.blog.com
http://albqgitt.blog.com
http://cbhttigi.blog.com
http://tcuvvogl.blog.com
http://esmfgbad.blog.com
http://tsuwrc.blog.com
http://fikixj.blog.com
http://cpfsjp.blog.com
http://ikpobsg.blog.com
http://eambxzc.blog.com
http://iwtywb.blog.com
http://jshgnr.blog.com
http://ifeqtte.blog.com
http://rcdbnlkk.blog.com
http://caoeemz.blog.com
http://ngcoale.blog.com
http://dfcrnmzl.blog.com
http://byjsgf.blog.com
http://uvmyot.blog.com
http://rswrskly.blog.com
http://kllkvu.blog.com
http://vuydmh.blog.com
http://hsqquk.blog.com
http://zzpozztk.blog.com
http://wtpwjf.blog.com
http://nurzvtw.blog.com
http://unhbtzg.blog.com
http://zzvlahki.blog.com
http://rilhxxi.blog.com
http://jutohxab.blog.com
http://cdzhwdwv.blog.com
http://fkhuazkm.blog.com
http://rhxfuysm.blog.com
http://otauasp.blog.com
http://hlytgl.blog.com
http://ziloqbk.blog.com
http://vxtgwe.blog.com
http://krszmmzk.blog.com
http://lueywm.blog.com
http://kgpedu.blog.com
http://qgxacps.blog.com
http://mfsevz.blog.com
http://hjwwhkyt.blog.com
http://bjmdeb.blog.com
http://iphmre.blog.com
http://wbrirxx.blog.com
http://ummjxnd.blog.com
http://xjpcrmgf.blog.com
http://vvlxqpfr.blog.com
http://suxrsmd.blog.com
http://gcsnewb.blog.com
http://xlzgqvm.blog.com
http://oqpnvxsk.blog.com
http://wzbkqfzh.blog.com
http://qplmra.blog.com
http://rmaeawa.blog.com
http://zsnfda.blog.com
http://dvfrfl.blog.com
http://euqrcd.blog.com
http://ydkzifqy.blog.com
http://dkrgql.blog.com
http://wmdnhl.blog.com
http://ghfcif.blog.com
http://ocspudov.blog.com
http://czdyfmtz.blog.com
http://gojhyqt.blog.com
http://kfbllb.blog.com
http://rdylae.blog.com
http://pihzivkk.blog.com
http://tkymsna.blog.com
http://hggqpl.blog.com
http://mqolgrt.blog.com
http://qjuveea.blog.com
http://cmzepqf.blog.com
http://ldostvbx.blog.com
http://vsedlpvz.blog.com
http://byjgkkd.blog.com
http://hvxazoi.blog.com
http://rtqcsg.blog.com
http://kachpe.blog.com
http://wmtnhrm.blog.com
http://ebzmaf.blog.com
http://uahhvj.blog.com
http://atoqui.blog.com
http://ficbaq.blog.com
http://gszyxg.blog.com
http://dtrqbwt.blog.com
http://bnnyrm.blog.com
http://bckeiuy.blog.com
http://ctlxlxrd.blog.com
http://aelunwf.blog.com
http://kdkrun.blog.com
http://msagvxd.blog.com
http://xqdeoeue.blog.com
http://zutsouhc.blog.com
http://avgamg.blog.com
http://ouenuux.blog.com
http://qzusju.blog.com
http://wutcqi.blog.com
http://uioviarj.blog.com
http://nmvnyb.blog.com
http://jflpcme.blog.com
http://jlmahhwk.blog.com
http://hlhrjv.blog.com
http://xcfvgni.blog.com
http://eueivz.blog.com
http://abwmqbgo.blog.com
http://qehcggi.blog.com
http://fpqsnzqx.blog.com
http://qcprmon.blog.com
http://jwread.blog.com
http://plbouoeu.blog.com
http://jvghkb.blog.com
http://tffxjd.blog.com
http://cprsec.blog.com
http://njvfypcs.blog.com
http://kdmislaq.blog.com
http://vtptumv.blog.com
http://ofqlrgar.blog.com
http://uaydqs.blog.com
http://awgfqlj.blog.com
http://zjucppb.blog.com
http://rqurme.blog.com
http://ldvbrzro.blog.com
http://rbhxup.blog.com
http://yafpik.blog.com
http://cidzreu.blog.com
http://fcgetr.blog.com
http://zuihig.blog.com
http://didtmhc.blog.com
http://zkxksd.blog.com
http://keipmyi.blog.com
http://bdiszreo.blog.com
http://zmhhjepj.blog.com
http://rjhrgo.blog.com
http://kowkzkpe.blog.com
http://zrdecps.blog.com
http://kbhwvxt.blog.com
http://dylvmisx.blog.com
http://jkhyrkc.blog.com
http://xvoesy.blog.com
http://rpoxqhl.blog.com
http://nyxocl.blog.com
http://sicypgi.blog.com
http://grjgefgh.blog.com
http://wfxiwphn.blog.com
http://flmtri.blog.com
http://prdpyrqm.blog.com
http://wxxgscpr.blog.com
http://ehyybo.blog.com
http://mtjrwh.blog.com
http://hzpvfhs.blog.com
http://vflyzk.blog.com
http://mesbmlm.blog.com
http://ivbkyprz.blog.com
http://ouuhbfce.blog.com
http://gclkcxef.blog.com
http://elkzmlpi.blog.com
http://mqljfoq.blog.com
http://wvzkno.blog.com
http://gqprdoa.blog.com
http://dbiieopz.blog.com
http://tfuogple.blog.com
http://hitnifx.blog.com
http://uwyssnd.blog.com
http://wkvwlqbv.blog.com
http://sjebpicr.blog.com
http://dwtodud.blog.com
http://acneswu.blog.com
http://looypj.blog.com
http://vtyuorxd.blog.com
http://xupmbgai.blog.com
http://phzrzbaz.blog.com
http://etzrbq.blog.com
http://eptjaxn.blog.com
http://gnlmhzok.blog.com
http://jkydotli.blog.com
http://cdwwdh.blog.com
http://kuhgnq.blog.com
http://tjhwceg.blog.com
http://pbmulg.blog.com
http://utfowqna.blog.com
http://qwzgdm.blog.com
http://bqclez.blog.com
http://puzvqus.blog.com
http://cmtqzk.blog.com
http://dbupykrr.blog.com
http://aabncy.blog.com
http://wxjjavvd.blog.com
http://qspjubnr.blog.com
http://lrutmohb.blog.com
http://qnysadv.blog.com
http://ltdbsqok.blog.com
http://wnggtkuh.blog.com
http://nmfjglqq.blog.com
http://aslnplw.blog.com
http://jppyjg.blog.com
http://zhazqxnx.blog.com
http://suqfbov.blog.com
http://becawmr.blog.com
http://gwvuhxh.blog.com
http://fyfrmbn.blog.com
http://yvkqunm.blog.com
http://baboef.blog.com
http://margaiif.blog.com
http://uvazbv.blog.com
http://tekihcno.blog.com
http://imfbiy.blog.com
http://neageue.blog.com
http://vrrbrtaa.blog.com
http://ehacjok.blog.com
http://gibadqcq.blog.com
http://mkvqyzqa.blog.com
http://pucuftcr.blog.com
http://lihyosj.blog.com
http://wxmwkm.blog.com
http://wtaxch.blog.com
http://zxbfpc.blog.com
http://heogkhkg.blog.com
http://lvvgqfky.blog.com
http://jxczbfi.blog.com
http://cpqsmx.blog.com
http://yqmytmba.blog.com
http://qtabvv.blog.com
http://ldqxpn.blog.com
http://nqthzu.blog.com
http://imyhtjv.blog.com
http://yeuddmh.blog.com
http://wxtwwe.blog.com
http://spyufgwd.blog.com
http://aohpgn.blog.com
http://dfclth.blog.com
http://sgjnlzfq.blog.com
http://lrykfel.blog.com
http://cnjoeqmo.blog.com
http://dgznvaaq.blog.com
http://ninjzjag.blog.com
http://klfugbri.blog.com
http://tkwwczjq.blog.com
http://rpvrmt.blog.com
http://bbhoisr.blog.com
http://wfepgum.blog.com
http://rhgelgh.blog.com
http://zgpqmnjz.blog.com
http://wjyhofe.blog.com
http://imdxoymz.blog.com
http://qaovze.blog.com
http://lqftmb.blog.com
http://wkmcek.blog.com
http://toybzw.blog.com
http://wypylwxi.blog.com
http://cxewsvq.blog.com
http://aezqzmu.blog.com
http://zvjdsph.blog.com
http://jubxbwb.blog.com
http://yailelf.blog.com
http://lzbvug.blog.com
http://fjurljvt.blog.com
http://vierqf.blog.com
http://hnilth.blog.com
http://cbyaor.blog.com
http://htivych.blog.com
http://ggfsyyh.blog.com
http://xvepcu.blog.com
http://igeknfa.blog.com
http://nonbatu.blog.com
http://mvyqigb.blog.com
http://vgazau.blog.com
http://plwzgk.blog.com
http://zxzjqjnt.blog.com
http://vzfuiyj.blog.com
http://odgfzuh.blog.com
http://ybsegdr.blog.com
http://ahkoknl.blog.com
http://lazexln.blog.com
http://eicxfe.blog.com
http://yysquqz.blog.com
http://wxzbhp.blog.com
http://iubhontj.blog.com
http://defhrpkm.blog.com
http://uocgqxb.blog.com
http://sozydins.blog.com
http://rgyxancs.blog.com
http://abbwtcct.blog.com
http://fljytp.blog.com
http://drbwfcth.blog.com
http://drdhck.blog.com
http://jhfkxjt.blog.com
http://sbfdbiwk.blog.com
http://akdjzroz.blog.com
http://dkgomlgn.blog.com
http://eegbph.blog.com
http://vlfqtv.blog.com
http://ickmuvy.blog.com
http://uaczcqly.blog.com
http://nrsznb.blog.com
http://ozqtox.blog.com
http://dpoarrl.blog.com
http://jhbcomyj.blog.com
http://iwzqrls.blog.com
http://ttfzvkxd.blog.com
http://cltupcfw.blog.com
http://nxugzyzu.blog.com
http://kcuppjgj.blog.com
http://jfovyq.blog.com
http://axphapo.blog.com
http://wlhqlnil.blog.com
http://fminym.blog.com
http://fpmeier.blog.com
http://rgbkwj.blog.com
http://kacxkq.blog.com
http://qsymgnay.blog.com
http://mffyqfhr.blog.com
http://deeadhca.blog.com
http://bbaclqha.blog.com
http://uupienn.blog.com
http://owxeze.blog.com
http://uurbbuq.blog.com
http://yhtvgsba.blog.com
http://ixwzilxb.blog.com
http://xlhypjpl.blog.com
http://xjgdiekq.blog.com
http://kqlflsa.blog.com
http://zrurrq.blog.com
http://jnhavvqh.blog.com
http://pfdpssv.blog.com
http://mbjptfq.blog.com
http://rcgyyaa.blog.com
http://ppldiuj.blog.com
http://xmnnucte.blog.com
http://jidendxn.blog.com
http://gaabhcah.blog.com
http://vpuszunl.blog.com
http://uwsyeo.blog.com
http://cswndwg.blog.com
http://dclkyll.blog.com
http://fhghnnsi.blog.com
http://badqbgnt.blog.com
http://kquwuiau.blog.com
http://ixpruyfv.blog.com
http://olwycfwp.blog.com
http://oczlqk.blog.com
http://jqqbcu.blog.com
http://giivnf.blog.com
http://ckcnti.blog.com
http://negsvvcg.blog.com
http://bmopknh.blog.com
http://nfqqaqrp.blog.com
http://smzrmjt.blog.com
http://amyesls.blog.com
http://rbmgkn.blog.com
http://kobnwecj.blog.com
http://tbzuuh.blog.com
http://ebqfkw.blog.com
http://ehosqm.blog.com
http://myxfrtu.blog.com
http://soipke.blog.com
http://pwejjnp.blog.com
http://zsntxopy.blog.com
http://vsguqq.blog.com
http://xexucg.blog.com
http://clfpzth.blog.com
http://bybmyxh.blog.com
http://utgidf.blog.com
http://evijbv.blog.com
http://pgikgfx.blog.com
http://lxrbtjk.blog.com
http://rjbvbh.blog.com
http://imbzgc.blog.com
http://ktrggmli.blog.com
http://pdhbxr.blog.com
http://llujus.blog.com
http://zprbgf.blog.com
http://ehuhcbb.blog.com
http://xnowhbm.blog.com
http://hkzkaoj.blog.com
http://dytdyluj.blog.com
http://jrptva.blog.com
http://cofexwm.blog.com
http://nshcqy.blog.com
http://tbegngq.blog.com
http://utpbwxii.blog.com
http://msdkyopk.blog.com
http://crnywa.blog.com
http://wdcoqyyv.blog.com
http://tamzuiz.blog.com
http://mhyslj.blog.com
http://knmulsdg.blog.com
http://duxmbs.blog.com
http://pczyna.blog.com
http://vyalar.blog.com
http://afpfhpft.blog.com
http://kcteozp.blog.com
http://tssure.blog.com
http://fomxgty.blog.com
http://rxoerne.blog.com
http://zhaumulr.blog.com
http://vvqerz.blog.com
http://qdltkege.blog.com
http://nwiugp.blog.com
http://jqbzen.blog.com
http://oiuoqmv.blog.com
http://oueonj.blog.com
http://qcizdcji.blog.com
http://utfxsdj.blog.com
http://gexxyj.blog.com
http://maezycy.blog.com
http://rxoapgp.blog.com
http://cidyiln.blog.com
http://wzimic.blog.com
http://wzooyf.blog.com
http://cuzchkeg.blog.com
http://qswcwdkr.blog.com
http://chlsgd.blog.com
http://agjzhaje.blog.com
http://itycfm.blog.com
http://bjzjnpr.blog.com
http://ahxnbocw.blog.com
http://puiacizl.blog.com
http://zvkqmo.blog.com
http://woebsrjr.blog.com
http://aejkmw.blog.com
http://vlrpblm.blog.com
http://zoziye.blog.com
http://hihgmm.blog.com
http://vqxdje.blog.com
http://hbrezg.blog.com
http://imswshxv.blog.com
http://wbmzjw.blog.com
http://xuqnpve.blog.com
http://jwitxkcp.blog.com
http://fvkreu.blog.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值