Re: BackgroundWorker and Nunit
Keith Woods <[email protected]> Wed, 24 Sep 2008 06:01:09 -0700 (PDT)
| Newsgroups | gmane.comp.windows.dotnet.nunit.user |
|---|---|
| Message-ID | <[email protected]> |
--===============5638425636642634651==
Content-Type: multipart/alternative; boundary="0-1800158045-1222261269=:1490"
--0-1800158045-1222261269=:1490
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Sorry guys, i think this is a general .net issue not Nunit. If i run the be=
low in a standard console application i get the same results. If anyone kno=
ws why, please let me know, otherwise I'll continue to figure it out.=0A=0A=
ctor .ctor=0AInitializeBackgoundWorker=0A DispatcherHash:1, IsBackgroun=
d:False, Id:1, ThreadState:MTA=0ARunBackgroundWorker=0A DispatcherHash:=
1, IsBackground:False, Id:1, ThreadState:MTA=0AProcessPhotosWorker_DoWork=
=0A DispatcherHash:3, IsBackground:True, Id:3, ThreadState:MTA=0AProces=
sPhotosWorker_ProgressChanged25%done=0A DispatcherHash:4, IsBackground:=
True, Id:4, ThreadState:MTA=0AProcessPhotosWorker_ProgressChanged50%done=0A=
DispatcherHash:4, IsBackground:True, Id:4, ThreadState:MTA=0AProcessPh=
otosWorker_ProgressChanged75%done=0A DispatcherHash:4, IsBackground:Tru=
e, Id:4, ThreadState:MTA=0AProcessPhotosWorker_ProgressChanged100%done=0A =
DispatcherHash:3, IsBackground:True, Id:3, ThreadState:MTA=0AProcessPhot=
osWorker_RunWorkerCompleted=0A DispatcherHash:3, IsBackground:True, Id:=
3, ThreadState:MTA=0A=0Actor .ctor=0A DispatcherHash:1, IsBackground:Fa=
lse, Id:1, ThreadState:MTA=0ABackgroundTask_Run=0A DispatcherHash:1, Is=
Background:False, Id:1, ThreadState:MTA=0ABackgroundTaskRunner=0A Dispa=
tcherHash:5, IsBackground:False, Id:5, ThreadState:MTA=0ABackgroundTask_Pro=
gressChanged25%done=0A DispatcherHash:3, IsBackground:True, Id:3, Threa=
dState:MTA=0ABackgroundTask_ProgressChanged50%done=0A DispatcherHash:3,=
IsBackground:True, Id:3, ThreadState:MTA=0ABackgroundTask_ProgressChanged7=
5%done=0A DispatcherHash:4, IsBackground:True, Id:4, ThreadState:MTA=0A=
BackgroundTask_ProgressChanged100%done=0A DispatcherHash:3, IsBackgroun=
d:True, Id:3, ThreadState:MTA=0ABackgroundTaskCompleted=0A DispatcherHa=
sh:3, IsBackground:True, Id:3, ThreadState:MTA=0A=0A=0A=0A=0A----- Original=
Message ----=0AFrom: Keith Woods <[email protected]>=0ATo: nunit-us=
[email protected]=0ASent: Wednesday, 24 September, 2008 12:12:33=0A=
Subject: Re: [Nunit-users] BackgroundWorker and Nunit=0A=0A=0AHere is simil=
ar code to that below, however using SynchronizationContext, same result :(=
=0A=0Ausing System;=0Ausing System.Collections.Generic;=0Ausing System.Lin=
q;=0Ausing System.Text;=0Ausing NUnit.Core;=0Ausing NUnit.Framework;=0Ausin=
g System.Threading;=0A=0Anamespace NunitBackgroundWorker=0A{=0A [TestFix=
ture]=0A public class BackgroundTester=0A {=0A [Test]=0A =
public void TestSyncContext()=0A {=0A new SyncContext()=
.BackgroundTask_Run();=0A=0A Thread.Sleep(5000);=0A=0A =
Console.WriteLine();=0A }=0A }=0A}=0A=0A=0Ausing System;=0Ausin=
g System.Collections.Generic;=0Ausing System.Linq;=0Ausing System.Text;=0Au=
sing System.ComponentModel;=0Ausing System.Reflection;=0Ausing System.Threa=
ding;=0Ausing System.Windows.Threading;=0A=0Anamespace NunitBackgroundWorke=
r=0A{=0A public class SyncContext=0A {=0A SynchronizationConte=
xt _context =3D null;=0A=0A public SyncContext()=0A {=0A =
int dispatcherHash =3D Dispatcher.CurrentDispatcher.Thread.GetHashCo=
de();=0A bool isBackGround =3D Dispatcher.CurrentDispatcher.Thre=
ad.IsBackground;=0A int id =3D Dispatcher.CurrentDispatcher.Thre=
ad.ManagedThreadId;=0A ApartmentState thread_state =3D Thread.Cu=
rrentThread.GetApartmentState();=0A Console.WriteLine("ctor " + =
MethodInfo.GetCurrentMethod().Name);=0A Console.WriteLine(" =
DispatcherHash:{0}, IsBackground:{1}, Id:{2}, ThreadState:{3}", dispatcherH=
ash, isBackGround, id, thread_state);=0A=0A _context =3D Synchro=
nizationContext.Current;=0A if (_context =3D=3D null)=0A =
{=0A _context =3D new SynchronizationContext();=0A =
SynchronizationContext.SetSynchronizationContext(_context);=0A =
}=0A }=0A=0A void BackgroundTask_ProgressChanged(obj=
ect state)=0A {=0A int dispatcherHash =3D Dispatcher.Curr=
entDispatcher.Thread.GetHashCode();=0A bool isBackGround =3D Dis=
patcher.CurrentDispatcher.Thread.IsBackground;=0A int id =3D Dis=
patcher.CurrentDispatcher.Thread.ManagedThreadId;=0A ApartmentSt=
ate thread_state =3D Thread.CurrentThread.GetApartmentState();=0A =
Console.WriteLine(MethodInfo.GetCurrentMethod().Name + state.ToString());=
=0A Console.WriteLine(" DispatcherHash:{0}, IsBackground:{1}=
, Id:{2}, ThreadState:{3}", dispatcherHash, isBackGround, id, thread_state)=
; =0A }=0A=0A private void BackgroundTaskRunner()=
=0A {=0A int dispatcherHash =3D Dispatcher.CurrentDispatc=
her.Thread.GetHashCode();=0A bool isBackGround =3D Dispatcher.Cu=
rrentDispatcher.Thread.IsBackground;=0A int id =3D Dispatcher.Cu=
rrentDispatcher.Thread.ManagedThreadId;=0A ApartmentState thread=
_state =3D Thread.CurrentThread.GetApartmentState();=0A Console.=
WriteLine(MethodInfo.GetCurrentMethod().Name);=0A Console.WriteL=
ine(" DispatcherHash:{0}, IsBackground:{1}, Id:{2}, ThreadState:{3}", d=
ispatcherHash, isBackGround, id, thread_state);=0A=0A _context.P=
ost(BackgroundTask_ProgressChanged, "25%done");=0A Thread.Sleep(=
1000);=0A _context.Post(BackgroundTask_ProgressChanged, "50%done=
");=0A Thread.Sleep(1000);=0A _context.Post(Backgroun=
dTask_ProgressChanged, "75%done");=0A Thread.Sleep(1000);=0A =
_context.Post(BackgroundTask_ProgressChanged, "100%done");=0A =
Thread.Sleep(1000);=0A _context.Post(BackgroundTaskComplet=
ed, "100%done");=0A }=0A=0A void BackgroundTaskCompleted(obje=
ct state)=0A {=0A int dispatcherHash =3D Dispatcher.Curre=
ntDispatcher.Thread.GetHashCode();=0A bool isBackGround =3D Disp=
atcher.CurrentDispatcher.Thread.IsBackground;=0A int id =3D Disp=
atcher.CurrentDispatcher.Thread.ManagedThreadId;=0A ApartmentSta=
te thread_state =3D Thread.CurrentThread.GetApartmentState();=0A =
Console.WriteLine(MethodInfo.GetCurrentMethod().Name);=0A Conso=
le.WriteLine(" DispatcherHash:{0}, IsBackground:{1}, Id:{2}, ThreadStat=
e:{3}", dispatcherHash, isBackGround, id, thread_state);=0A }=0A=0A =
public void BackgroundTask_Run()=0A {=0A int dispa=
tcherHash =3D Dispatcher.CurrentDispatcher.Thread.GetHashCode();=0A =
bool isBackGround =3D Dispatcher.CurrentDispatcher.Thread.IsBackground;=
=0A int id =3D Dispatcher.CurrentDispatcher.Thread.ManagedThread=
Id;=0A ApartmentState thread_state =3D Thread.CurrentThread.GetA=
partmentState();=0A Console.WriteLine(MethodInfo.GetCurrentMetho=
d().Name);=0A Console.WriteLine(" DispatcherHash:{0}, IsBack=
ground:{1}, Id:{2}, ThreadState:{3}", dispatcherHash, isBackGround, id, thr=
ead_state);=0A=0A ThreadStart threadStart =3D new ThreadStart(Ba=
ckgroundTaskRunner);=0A Thread newThread =3D new Thread(threadSt=
art);=0A newThread.Start();=0A }=0A }=0A}=0A =0A=0A=0A=
----- Original Message ----=0AFrom: Keith Woods <[email protected]>=
=0ATo: [email protected]=0ASent: Wednesday, 24 September, 2=
008 10:22:28=0ASubject: [Nunit-users] BackgroundWorker and Nunit=0A=0A=0AHi=
Everyone=0A =0AI=E2=80=99ve been=0Atrying to test some code that uses a ba=
ckground worker. The issues I=E2=80=99m having=0Ais that my test appears to=
NOT report progress on the same thread that created=0Athe background worke=
r. For tests that involve Dependency objects (WPF) the call=0Aback needs to=
happen on the same thread.=0A =0AI have a=0Asample application using Backg=
roundWorker (this is below) for one test and=0ASynchronizationContext for a=
nother, both are reporting back onto another=0Athread, not the correct one.=
=0A =0AUsing nunit=0AGUI I=E2=80=99ve explicitly set the test to run in t=
he STA ApartmentState.=0AUsing nunit=0Aconsole I=E2=80=99ve specified /noth=
read flag=0A =0ANothings=0Aappears to be working. I=E2=80=99m either misund=
erstanding the functionality provided=0Aby BackgroundWorker/Synchronization=
Context, incorrectly using nunit, or it=E2=80=99s a=0Abug in nunit.=0A =0AA=
ny help=0Awould be much appreciated, =0A =0ACheers=0A =0AKeith=0A =0Ap.s. H=
ere=0Ais the test with the background worker:=0A =0AusingSystem;=0AusingSys=
tem.Collections.Generic;=0AusingSystem.Linq;=0AusingSystem.Text;=0AusingNUn=
it.Core;=0AusingNUnit.Framework;=0AusingSystem.Threading;=0A =0AnamespaceNu=
nitBackgroundWorker=0A{=0A [TestFixture]=0A public class BackgroundTe=
ster=0A {=0A [Test]=0A public void TestBackgroundWorker()=
=0A {=0A new Background().RunBackgroundWorker();=0A =0A =
Thread.Sleep(5000);=0A =0A Console.WriteLine();=0A =
}=0A}=0A =0AusingSystem;=0AusingSystem.Collections.Generic;=0AusingSyst=
em.Linq;=0AusingSystem.Text;=0AusingSystem.ComponentModel;=0AusingSystem.Re=
flection;=0AusingSystem.Threading;=0AusingSystem.Windows.Threading;=0A =0An=
amespaceNunitBackgroundWorker=0A{=0A public class Background=0A {=0A =
private BackgroundWorker _worker =3D null;=0A =0A public Back=
ground()=0A {=0A Console.WriteLine("ctor=0A" + MethodInfo=
.GetCurrentMethod().Name);=0A =0A =0AInitializeBackgoundWorker();=
=0A }=0A =0A private void InitializeBackgoundWorker()=0A =
{=0A int dispatcherHash =3D Dispatcher.CurrentDispatcher.Thre=
ad.GetHashCode();=0A bool isBackGround =3D Dispatcher.CurrentDis=
patcher.Thread.IsBackground;=0A int id =3D Dispatcher.CurrentDis=
patcher.Thread.ManagedThreadId;=0A ApartmentState thread_state =
=3D Dispatcher.CurrentDispatcher.Thread.GetApartmentState();=0A =
Console.WriteLine(MethodInfo.GetCurrentMethod().Name);=0A Consol=
e.WriteLine(" =0ADispatcherHash:{0}, IsBackground:{1}, Id:{2}, ThreadSta=
te:{3}",=0AdispatcherHash, isBackGround, id, thread_state);=0A =0A =
=0A_worker =3D new BackgroundWorker();=0A =0A_worker.DoWork +=
=3D new DoWorkEventHandler(ProcessPhotosWorker_DoWork);=0A =0A_wo=
rker.RunWorkerCompleted +=3D new RunWorkerCompletedEventHandler(ProcessPhot=
osWorker_RunWorkerCompleted);=0A =0A _worker.ProgressChanged +=3D =
new ProgressChangedEventHandler(ProcessPhotosWorker_ProgressChanged);=0A =
=0A_worker.WorkerReportsProgress =3D true;=0A }=0A =0A =
void ProcessPhotosWorker_ProgressChanged(object sender, ProgressChangedEv=
entArgs e)=0A {=0A int dispatcherHash =3D Dispatcher.Curr=
entDispatcher.Thread.GetHashCode();=0A bool isBackGround =3D Dis=
patcher.CurrentDispatcher.Thread.IsBackground;=0A int id =3D Dis=
patcher.CurrentDispatcher.Thread.ManagedThreadId;=0A =0A Apartment=
State thread_state =3D Dispatcher.CurrentDispatcher.Thread.GetApartmentStat=
e();=0A Console.WriteLine(MethodInfo.GetCurrentMethod().Name=0A+=
e.UserState.ToString());=0A Console.WriteLine(" =0ADispatche=
rHash:{0}, IsBackground:{1}, Id:{2}, ThreadState:{3}",=0AdispatcherHash, is=
BackGround, id, thread_state);=0A }=0A =0A private void Proce=
ssPhotosWorker_DoWork(object sender, DoWorkEventArgs e)=0A {=0A =
int dispatcherHash =3D Dispatcher.CurrentDispatcher.Thread.GetHashCo=
de();=0A bool isBackGround =3D Dispatcher.CurrentDispatcher.Thre=
ad.IsBackground;=0A int id =3D Dispatcher.CurrentDispatcher.Thre=
ad.ManagedThreadId;=0A ApartmentState thread_state =3D Dispatche=
r.CurrentDispatcher.Thread.GetApartmentState();=0A Console.Write=
Line(MethodInfo.GetCurrentMethod().Name);=0A Console.WriteLine("=
=0ADispatcherHash:{0}, IsBackground:{1}, Id:{2}, ThreadState:{3}",=0Adi=
spatcherHash, isBackGround, id, thread_state);=0A =0A =0A_worker.=
ReportProgress(25, "25%done");=0A Thread.Sleep(1000);=0A =
=0A_worker.ReportProgress(50, "50%done");=0A Thread.Sleep(100=
0);=0A =0A_worker.ReportProgress(75, "75%done");=0A Th=
read.Sleep(1000);=0A =0A_worker.ReportProgress(100, "100%done");=
=0A }=0A =0A void ProcessPhotosWorker_RunWorkerCompleted(obje=
ct sender, RunWorkerCompletedEventArgs e)=0A {=0A int dis=
patcherHash =3D Dispatcher.CurrentDispatcher.Thread.GetHashCode();=0A =
bool isBackGround =3D Dispatcher.CurrentDispatcher.Thread.IsBackgroun=
d;=0A int id =3D Dispatcher.CurrentDispatcher.Thread.ManagedThre=
adId;=0A ApartmentState thread_state =3D Dispatcher.CurrentDispa=
tcher.Thread.GetApartmentState();=0A Console.WriteLine(MethodInf=
o.GetCurrentMethod().Name);=0A Console.WriteLine(" =0ADispatc=
herHash:{0}, IsBackground:{1}, Id:{2}, ThreadState:{3}",=0AdispatcherHash, =
isBackGround, id, thread_state);=0A }=0A =0A public void RunB=
ackgroundWorker()=0A {=0A int dispatcherHash =3D Dispatch=
er.CurrentDispatcher.Thread.GetHashCode();=0A bool isBackGround =
=3D Dispatcher.CurrentDispatcher.Thread.IsBackground;=0A int id =
=3D Dispatcher.CurrentDispatcher.Thread.ManagedThreadId;=0A Apar=
tmentState thread_state =3D Dispatcher.CurrentDispatcher.Thread.GetApartmen=
tState();=0A Console.WriteLine(MethodInfo.GetCurrentMethod().Nam=
e);=0A Console.WriteLine(" =0ADispatcherHash:{0}, IsBackgroun=
d:{1}, Id:{2}, ThreadState:{3}",=0AdispatcherHash, isBackGround, id, thread=
_state);=0A =0A =0A_worker.RunWorkerAsync("TestData");=0A =
}=0A }=0A}=0A=0A=0A
--0-1800158045-1222261269=:1490
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
<html><head><style type=3D"text/css"><!-- DIV {margin:0px;} --></style></he=
ad><body><div style=3D"font-family:tahoma, 'new york', times, serif;font-si=
ze:12pt"><div>Sorry guys, i think this is a general .net issue not Nunit. I=
f i run the below in a standard console application i get the same results.=
If anyone knows why, please let me know, otherwise I'll continue to figure=
it out.</div><div><br></div><div><div>ctor .ctor</div><div>InitializeBackg=
oundWorker</div><div>=C2=A0=C2=A0 =C2=A0 DispatcherHash:1, IsBackground:Fal=
se, Id:1, ThreadState:MTA</div><div>RunBackgroundWorker</div><div>=C2=A0=C2=
=A0 =C2=A0 DispatcherHash:1, IsBackground:False, Id:1, ThreadState:MTA</div=
><div>ProcessPhotosWorker_DoWork</div><div>=C2=A0=C2=A0 =C2=A0 DispatcherHa=
sh:3, IsBackground:True, Id:3, ThreadState:MTA</div><div>ProcessPhotosWorke=
r_ProgressChanged25%done</div><div>=C2=A0=C2=A0 =C2=A0 DispatcherHash:4, Is=
Background:True, Id:4, ThreadState:MTA</div><div>ProcessPhotosWorker_Progre=
ssChanged50%done</div><div>=C2=A0=C2=A0 =C2=A0
DispatcherHash:4, IsBackground:True, Id:4, ThreadState:MTA</div><div>Proce=
ssPhotosWorker_ProgressChanged75%done</div><div>=C2=A0=C2=A0 =C2=A0 Dispatc=
herHash:4, IsBackground:True, Id:4, ThreadState:MTA</div><div>ProcessPhotos=
Worker_ProgressChanged100%done</div><div>=C2=A0=C2=A0 =C2=A0 DispatcherHash=
:3, IsBackground:True, Id:3, ThreadState:MTA</div><div>ProcessPhotosWorker_=
RunWorkerCompleted</div><div>=C2=A0=C2=A0 =C2=A0 DispatcherHash:3, IsBackgr=
ound:True, Id:3, ThreadState:MTA</div><div><br></div><div>ctor .ctor</div><=
div>=C2=A0=C2=A0 =C2=A0 DispatcherHash:1, IsBackground:False, Id:1, ThreadS=
tate:MTA</div><div>BackgroundTask_Run</div><div>=C2=A0=C2=A0 =C2=A0 Dispatc=
herHash:1, IsBackground:False, Id:1, ThreadState:MTA</div><div>BackgroundTa=
skRunner</div><div>=C2=A0=C2=A0 =C2=A0 DispatcherHash:5, IsBackground:False=
, Id:5, ThreadState:MTA</div><div>BackgroundTask_ProgressChanged25%done</di=
v><div>=C2=A0=C2=A0 =C2=A0 DispatcherHash:3, IsBackground:True, Id:3, Threa=
dState:MTA</div><div>BackgroundTask_ProgressChanged50%done</div><div>=C2=A0=
=C2=A0 =C2=A0
DispatcherHash:3, IsBackground:True, Id:3, ThreadState:MTA</div><div>Backg=
roundTask_ProgressChanged75%done</div><div>=C2=A0=C2=A0 =C2=A0 DispatcherHa=
sh:4, IsBackground:True, Id:4, ThreadState:MTA</div><div>BackgroundTask_Pro=
gressChanged100%done</div><div>=C2=A0=C2=A0 =C2=A0 DispatcherHash:3, IsBack=
ground:True, Id:3, ThreadState:MTA</div><div>BackgroundTaskCompleted</div><=
div>=C2=A0=C2=A0 =C2=A0 DispatcherHash:3, IsBackground:True, Id:3, ThreadSt=
ate:MTA</div><div><br></div><div><br></div></div><div style=3D"font-family:=
tahoma, new york, times, serif;font-size:12pt"><br><div style=3D"font-famil=
y:times new roman, new york, times, serif;font-size:12pt">----- Original Me=
ssage ----<br>From: Keith Woods <[email protected]><br>To: nunit-=
[email protected]<br>Sent: Wednesday, 24 September, 2008 12:12:33=
<br>Subject: Re: [Nunit-users] BackgroundWorker and Nunit<br><br><div style=
=3D"font-family:tahoma, 'new york', times, serif;font-size:12pt;"><div>Here=
is similar code to that below,
however using=C2=A0SynchronizationContext, same result :(=C2=A0</div><div>=
<br></div><div><div>using System;</div><div>using System.Collections.Generi=
c;</div><div>using System.Linq;</div><div>using System.Text;</div><div>usin=
g NUnit.Core;</div><div>using NUnit.Framework;</div><div>using System.Threa=
ding;</div><div><br></div><div>namespace NunitBackgroundWorker</div><div>{<=
/div><div>=C2=A0=C2=A0 =C2=A0[TestFixture]</div><div>=C2=A0=C2=A0 =C2=A0pub=
lic class BackgroundTester</div><div>=C2=A0=C2=A0 =C2=A0{</div><div>=C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0[Test]</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=
=A0public void TestSyncContext()</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=
=A0{</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0new SyncConte=
xt().BackgroundTask_Run();</div><div><br></div><div>=C2=A0=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0Thread.Sleep(5000);</div><div><br></div><div>=C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=0A =C2=A0Console.WriteLine();</div><div>=
=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0}</div><div>=C2=A0=C2=A0 =C2=A0}</div><div=
>}</div><div><br></div><div><br></div></div><div>using System;</div><div>us=
ing System.Collections.Generic;</div><div>using System.Linq;</div><div>usin=
g System.Text;</div><div>using System.ComponentModel;</div><div>using Syste=
m.Reflection;</div><div>using System.Threading;</div><div>using System.Wind=
ows.Threading;</div><div><br></div><div>namespace NunitBackgroundWorker</di=
v><div>{</div><div>=C2=A0=C2=A0 =C2=A0public class SyncContext</div><div>=
=C2=A0=C2=A0 =C2=A0{</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0Synchroniza=
tionContext _context =3D null;</div><div><br></div><div>=C2=A0=C2=A0 =C2=A0=
=C2=A0 =C2=A0public SyncContext()</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=
=A0{</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int dispatche=
rHash =3D Dispatcher.CurrentDispatcher.Thread.GetHashCode();</div><div>=C2=
=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bool isBackGround =3D Dispatche=
r.CurrentDispatcher.Thread.IsBackground;</div><div>=C2=A0=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0int id =3D=0A Dispatcher.CurrentDispatcher.Thread.M=
anagedThreadId;</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Ap=
artmentState thread_state =3D Thread.CurrentThread.GetApartmentState();</di=
v><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Console.WriteLine("ct=
or " + MethodInfo.GetCurrentMethod().Name);</div><div>=C2=A0=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0Console.WriteLine(" =C2=A0 =C2=A0 DispatcherHash=
:{0}, IsBackground:{1}, Id:{2}, ThreadState:{3}", dispatcherHash, isBackGro=
und, id, thread_state);</div><div><br></div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0=
=C2=A0 =C2=A0 =C2=A0_context =3D SynchronizationContext.Current;</div><div=
>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (_context =3D=3D null)</=
div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{</div><div>=C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0_context =3D new Syn=
chronizationContext();</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0SynchronizationContext.SetSynchronizationContext(_conte=
xt);</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}</div><div>=
=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0}</div><div><br></div><div>=C2=A0=C2=A0 =
=C2=A0 =C2=A0 =C2=A0void BackgroundTask_ProgressChanged(object state)</div>=
<div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0{</div><div>=C2=A0=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0int=0A dispatcherHash =3D Dispatcher.CurrentDispatc=
her.Thread.GetHashCode();</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0bool isBackGround =3D Dispatcher.CurrentDispatcher.Thread.IsBackg=
round;</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int id =3D =
Dispatcher.CurrentDispatcher.Thread.ManagedThreadId;</div><div>=C2=A0=C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ApartmentState thread_state =3D Thread.C=
urrentThread.GetApartmentState();</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0Console.WriteLine(MethodInfo.GetCurrentMethod().Name + sta=
te.ToString());</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Co=
nsole.WriteLine(" =C2=A0 =C2=A0 DispatcherHash:{0}, IsBackground:{1}, Id:{2=
}, ThreadState:{3}", dispatcherHash, isBackGround, id, thread_state); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0=
=C2=A0}</div><div><br></div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0private =
void BackgroundTaskRunner()</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0{</d=
iv><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int dispatcherHash =
=3D Dispatcher.CurrentDispatcher.Thread.GetHashCode();</div><div>=C2=A0=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bool isBackGround =3D=0A Dispatcher.C=
urrentDispatcher.Thread.IsBackground;</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0int id =3D Dispatcher.CurrentDispatcher.Thread.ManagedT=
hreadId;</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Apartment=
State thread_state =3D Thread.CurrentThread.GetApartmentState();</div><div>=
=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Console.WriteLine(MethodInfo=
.GetCurrentMethod().Name);</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0Console.WriteLine(" =C2=A0 =C2=A0 DispatcherHash:{0}, IsBackgroun=
d:{1}, Id:{2}, ThreadState:{3}", dispatcherHash, isBackGround, id, thread_s=
tate);</div><div><br></div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0_context.Post(BackgroundTask_ProgressChanged, "25%done");</div><div>=
=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Thread.Sleep(1000);</div><di=
v>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0_context.Post(BackgroundTa=
sk_ProgressChanged, "50%done");</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0 =C2=A0Thread.Sleep(1000);</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0_context.Post(BackgroundTask_ProgressChanged, "75%done");<=
/div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Thread.Sleep(1000)=
;</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=0A =C2=A0_context.Post=
(BackgroundTask_ProgressChanged, "100%done");</div><div>=C2=A0=C2=A0 =C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0Thread.Sleep(1000);</div><div>=C2=A0=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0_context.Post(BackgroundTaskCompleted, "100%=
done");</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0}</div><div><br></div><d=
iv>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0void BackgroundTaskCompleted(object sta=
te)</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0{</div><div>=C2=A0=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int dispatcherHash =3D Dispatcher.CurrentDis=
patcher.Thread.GetHashCode();</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0bool isBackGround =3D Dispatcher.CurrentDispatcher.Thread.IsBa=
ckground;</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int id =
=3D Dispatcher.CurrentDispatcher.Thread.ManagedThreadId;</div><div>=C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ApartmentState thread_state =3D Th=
read.CurrentThread.GetApartmentState();</div><div>=C2=A0=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0Console.WriteLine(MethodInfo.GetCurrentMethod().Nam=
e);</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Console.WriteL=
ine(" =C2=A0 =C2=A0 DispatcherHash:{0}, IsBackground:{1}, Id:{2}, ThreadSta=
te:{3}", dispatcherHash, isBackGround, id,=0A thread_state);</div><div>=C2=
=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0}</div><div><br></div><div>=C2=A0=C2=A0 =C2=
=A0 =C2=A0 =C2=A0public void BackgroundTask_Run()</div><div>=C2=A0=C2=A0 =
=C2=A0 =C2=A0 =C2=A0{</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0int dispatcherHash =3D Dispatcher.CurrentDispatcher.Thread.GetHashCod=
e();</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bool isBackGr=
ound =3D Dispatcher.CurrentDispatcher.Thread.IsBackground;</div><div>=C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int id =3D Dispatcher.CurrentDispa=
tcher.Thread.ManagedThreadId;</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0ApartmentState thread_state =3D Thread.CurrentThread.GetApartm=
entState();</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Consol=
e.WriteLine(MethodInfo.GetCurrentMethod().Name);</div><div>=C2=A0=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Console.WriteLine(" =C2=A0 =C2=A0 Dispatcher=
Hash:{0}, IsBackground:{1}, Id:{2}, ThreadState:{3}", dispatcherHash, isBac=
kGround, id, thread_state);</div><div><br></div><div>=C2=A0=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0ThreadStart threadStart =3D new ThreadStart(Back=
groundTaskRunner);</div><div>=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0Thread newThread =3D new=0A Thread(threadStart);</div><div>=C2=A0=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0newThread.Start();</div><div>=C2=A0=C2=A0=
=C2=A0 =C2=A0 =C2=A0}</div><div>=C2=A0=C2=A0 =C2=A0}</div><div>}</div><div=
>=C2=A0</div><div style=3D"font-family:tahoma, new york, times, serif;font-=
size:12pt;"><br><div style=3D"font-family:times new roman, new york, times,=
serif;font-size:12pt;">----- Original Message ----<br>From: Keith Woods &l=
t;[email protected]><br>To: [email protected]<br>Sen=
t: Wednesday, 24 September, 2008 10:22:28<br>Subject: [Nunit-users] Backgro=
undWorker and Nunit<br><br><div style=3D"font-family:tahoma, 'new york', ti=
mes, serif;font-size:12pt;"><div><p class=3D"MsoNormal"><span lang=3D"EN-AU=
" style=3D"">Hi Everyone</span></p> =0A=0A<p class=3D"MsoNormal"><span lang=
=3D"EN-AU" style=3D""> =C2=A0</span></p> =0A=0A<p class=3D"MsoNormal"><span=
lang=3D"EN-AU" style=3D"">I=E2=80=99ve been=0Atrying to test some code tha=
t uses a background worker. The issues I=E2=80=99m having=0Ais that my test=
appears to NOT report progress on the same thread that created=0Athe backg=
round worker. For tests that involve Dependency objects (WPF) the call=0Aba=
ck needs to happen on the same thread.</span></p> =0A=0A<p class=3D"MsoNorm=
al"><span lang=3D"EN-AU" style=3D""> =C2=A0</span></p> =0A=0A<p class=3D"Ms=
oNormal"><span lang=3D"EN-AU" style=3D"">I have a=0Asample application usin=
g BackgroundWorker (this is below) for one test and=0ASynchronizationContex=
t for another, both are reporting back onto another=0Athread, not the corre=
ct one.=C2=A0 </span></p> =0A=0A<p class=3D"MsoNormal"><span lang=3D"EN-AU"=
style=3D""> =C2=A0</span></p> =0A=0A<p class=3D"MsoNormal"><span lang=3D"E=
N-AU" style=3D"">Using nunit=0AGUI I=E2=80=99ve explicitly set the test to =
run in the STA ApartmentState.</span></p> =0A=0A<p class=3D"MsoNormal"><spa=
n lang=3D"EN-AU" style=3D"">Using nunit=0Aconsole I=E2=80=99ve specified /n=
othread flag</span></p> =0A=0A<p class=3D"MsoNormal"><b><span lang=3D"EN-AU=
" style=3D""> =C2=A0</span></b></p> =0A=0A<p class=3D"MsoNormal"><span lang=
=3D"EN-AU" style=3D"">Nothings=0Aappears to be working. I=E2=80=99m either =
misunderstanding the functionality provided=0Aby BackgroundWorker/Synchroni=
zationContext, incorrectly using nunit, or it=E2=80=99s a=0Abug in nunit.</=
span></p> =0A=0A<p class=3D"MsoNormal"><span lang=3D"EN-AU" style=3D""> =C2=
=A0</span></p> =0A=0A<p class=3D"MsoNormal"><span lang=3D"EN-AU" style=3D""=
>Any help=0Awould be much appreciated, </span></p> =0A=0A<p class=3D"MsoNor=
mal"><span lang=3D"EN-AU" style=3D""> =C2=A0</span></p> =0A=0A<p class=3D"M=
soNormal"><span lang=3D"EN-AU" style=3D"">Cheers</span></p> =0A=0A<p class=
=3D"MsoNormal"><span lang=3D"EN-AU" style=3D""> =C2=A0</span></p> =0A=0A<p =
class=3D"MsoNormal"><span lang=3D"EN-AU" style=3D"">Keith</span></p> =0A=0A=
<p class=3D"MsoNormal"><span lang=3D"EN-AU" style=3D""> =C2=A0</span></p> =
=0A=0A<p class=3D"MsoNormal"><span lang=3D"EN-AU" style=3D"">p.s. Here=0Ais=
the test with the background worker:</span></p> =0A=0A<p class=3D"MsoNorma=
l"><span lang=3D"EN-AU" style=3D""> =C2=A0</span></p> =0A=0A<p class=3D"Mso=
Normal" style=3D""><span style=3D"font-size:10.0pt;color:blue;">using</span=
><span style=3D"font-size:10.0pt;"> System;</span></p> =0A=0A<p class=3D"Ms=
oNormal" style=3D""><span style=3D"font-size:10.0pt;color:blue;">using</spa=
n><span style=3D"font-size:10.0pt;"> System.Collections.Generic;</span></p>=
=0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;co=
lor:blue;">using</span><span style=3D"font-size:10.0pt;"> System.Linq;</spa=
n></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.=
0pt;color:blue;">using</span><span style=3D"font-size:10.0pt;"> System.Text=
;</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-si=
ze:10.0pt;color:blue;">using</span><span style=3D"font-size:10.0pt;"> NUnit=
.Core;</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"fo=
nt-size:10.0pt;color:blue;">using</span><span style=3D"font-size:10.0pt;"> =
NUnit.Framework;</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span s=
tyle=3D"font-size:10.0pt;color:blue;">using</span><span style=3D"font-size:=
10.0pt;"> System.Threading;</span></p> =0A=0A<p class=3D"MsoNormal" style=
=3D""><span style=3D"font-size:10.0pt;"> =C2=A0</span></p> =0A=0A<p class=
=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;color:blue;">name=
space</span><span style=3D"font-size:10.0pt;"> NunitBackgroundWorker</span>=
</p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0p=
t;">{</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"fon=
t-size:10.0pt;">=C2=A0=C2=A0=C2=A0 [<span style=3D"color:#2B91AF;">TestFixt=
ure</span>]</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=
=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0 <span style=3D"color:blue;">publi=
c</span>=0A<span style=3D"color:blue;">class</span> <span style=3D"color:#2=
B91AF;">BackgroundTester</span></span></p> =0A=0A<p class=3D"MsoNormal" sty=
le=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0 {</span></p> =
=0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 [<span style=3D"color:#2B91AF;">=
Test</span>]</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=
=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <span sty=
le=3D"color:blue;">public</span> <span style=3D"color:blue;">void</span>=0A=
TestBackgroundWorker()</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><=
span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
{</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-s=
ize:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=0A<span style=3D"color:blue;">new</span> <span style=3D"color:#2B91A=
F;">Background</span>().RunBackgroundWorker();</span></p> =0A=0A<p class=3D=
"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;"> =C2=A0</span></p>=
=0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span =
style=3D"color:#2B91AF;">Thread</span>.Sleep(5000);</span></p> =0A=0A<p cla=
ss=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;"> =C2=A0</span=
></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0=
pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<=
span style=3D"color:#2B91AF;">Console</span>.WriteLine();</span></p> =0A=0A=
<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }</span></p> =0A=0A<p class=3D"MsoNorm=
al"><span style=3D"font-size:10.0pt;">}</span></p> =0A=0A<p class=3D"MsoNor=
mal"><span lang=3D"EN-AU" style=3D""> =C2=A0</span></p> =0A=0A<p class=3D"M=
soNormal" style=3D""><span style=3D"font-size:10.0pt;color:blue;">using</sp=
an><span style=3D"font-size:10.0pt;"> System;</span></p> =0A=0A<p class=3D"=
MsoNormal" style=3D""><span style=3D"font-size:10.0pt;color:blue;">using</s=
pan><span style=3D"font-size:10.0pt;"> System.Collections.Generic;</span></=
p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;=
color:blue;">using</span><span style=3D"font-size:10.0pt;"> System.Linq;</s=
pan></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:1=
0.0pt;color:blue;">using</span><span style=3D"font-size:10.0pt;"> System.Te=
xt;</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-=
size:10.0pt;color:blue;">using</span><span style=3D"font-size:10.0pt;"> Sys=
tem.ComponentModel;</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><spa=
n style=3D"font-size:10.0pt;color:blue;">using</span><span style=3D"font-si=
ze:10.0pt;"> System.Reflection;</span></p> =0A=0A<p class=3D"MsoNormal" sty=
le=3D""><span style=3D"font-size:10.0pt;color:blue;">using</span><span styl=
e=3D"font-size:10.0pt;"> System.Threading;</span></p> =0A=0A<p class=3D"Mso=
Normal" style=3D""><span style=3D"font-size:10.0pt;color:blue;">using</span=
><span style=3D"font-size:10.0pt;"> System.Windows.Threading;</span></p> =
=0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;"> =
=C2=A0</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"fo=
nt-size:10.0pt;color:blue;">namespace</span><span style=3D"font-size:10.0pt=
;"> NunitBackgroundWorker</span></p> =0A=0A<p class=3D"MsoNormal" style=3D"=
"><span style=3D"font-size:10.0pt;">{</span></p> =0A=0A<p class=3D"MsoNorma=
l" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0 <span st=
yle=3D"color:blue;">public</span>=0A<span style=3D"color:blue;">class</span=
> <span style=3D"color:#2B91AF;">Background</span></span></p> =0A=0A<p clas=
s=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=
=C2=A0 {</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"=
font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <span style=
=3D"color:blue;">private</span> <span style=3D"color:#2B91AF;">BackgroundWo=
rker</span>=0A_worker =3D <span style=3D"color:blue;">null</span>;</span></=
p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;=
"> =C2=A0</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D=
"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <span style=
=3D"color:blue;">public</span> Background()</span></p> =0A=0A<p class=3D"Ms=
oNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0 {</span></p> =0A=0A<p class=3D"MsoNormal" style=3D"">=
<span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:#2B91AF;">Console</span>=
.WriteLine(<span style=3D"color:#A31515;">"ctor=0A"</span> + <span style=3D=
"color:#2B91AF;">MethodInfo</span>.GetCurrentMethod().Name);</span></p> =0A=
=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;"> =C2=
=A0</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-=
size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=0AInitializeBackgoundWorker();</span></p> =0A=0A<p class=3D"MsoNorma=
l" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 }</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span =
style=3D"font-size:10.0pt;"> =C2=A0</span></p> =0A=0A<p class=3D"MsoNormal"=
style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 <span style=3D"color:blue;">private</span> <span style=3D"c=
olor:blue;">void</span>=0AInitializeBackgoundWorker()</span></p> =0A=0A<p c=
lass=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 {</span></p> =0A=0A<p class=3D"MsoNormal"=
style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:blue;">int</=
span> dispatcherHash =3D <span style=3D"color:#2B91AF;">Dispatcher</span>.C=
urrentDispatcher.Thread.GetHashCode();</span></p> =0A=0A<p class=3D"MsoNorm=
al" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:blue;">bo=
ol</span> isBackGround =3D <span style=3D"color:#2B91AF;">Dispatcher</span>=
.CurrentDispatcher.Thread.IsBackground;</span></p> =0A=0A<p class=3D"MsoNor=
mal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:blue;">in=
t</span> id =3D <span style=3D"color:#2B91AF;">Dispatcher</span>.CurrentDis=
patcher.Thread.ManagedThreadId;</span></p> =0A=0A<p class=3D"MsoNormal" sty=
le=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:#2B91AF;">Apartmen=
tState</span> thread_state =3D <span style=3D"color:#2B91AF;">Dispatcher</s=
pan>.CurrentDispatcher.Thread.GetApartmentState();</span></p> =0A=0A<p clas=
s=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"col=
or:#2B91AF;">Console</span>.WriteLine(<span style=3D"color:#2B91AF;">Method=
Info</span>.GetCurrentMethod().Name);</span></p> =0A=0A<p class=3D"MsoNorma=
l" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:#2B91AF;">Co=
nsole</span>.WriteLine(<span style=3D"color:#A31515;">"=C2=A0=C2=A0=C2=A0=
=C2=A0=0ADispatcherHash:{0}, IsBackground:{1}, Id:{2}, ThreadState:{3}"</sp=
an>,=0AdispatcherHash, isBackGround, id, thread_state);</span></p> =0A=0A<p=
class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;"> =C2=A0</=
span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:=
10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=0A_worker =3D <span style=3D"color:blue;">new</span> <span style=3D"color:=
#2B91AF;">BackgroundWorker</span>();</span></p> =0A=0A<p class=3D"MsoNormal=
" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A_worker.DoWork +=3D <span style=
=3D"color:blue;">new</span> <span style=3D"color:#2B91AF;">DoWorkEventHandl=
er</span>(ProcessPhotosWorker_DoWork);</span></p> =0A=0A<p class=3D"MsoNorm=
al" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A_worker.RunWorkerCompleted +=
=3D <span style=3D"color:blue;">new</span> <span style=3D"color:#2B91AF;">R=
unWorkerCompletedEventHandler</span>(ProcessPhotosWorker_RunWorkerCompleted=
);</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-s=
ize:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A=C2=A0=C2=
=A0=C2=A0_worker.ProgressChanged +=3D <span style=3D"color:blue;">new</span=
>=0A<span style=3D"color:#2B91AF;">ProgressChangedEventHandler</span>(Proce=
ssPhotosWorker_ProgressChanged);</span></p> =0A=0A<p class=3D"MsoNormal" st=
yle=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A_worker.WorkerReportsProgress =3D <s=
pan style=3D"color:blue;">true</span>;</span></p> =0A=0A<p class=3D"MsoNorm=
al" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 }</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><sp=
an style=3D"font-size:10.0pt;"> =C2=A0</span></p> =0A=0A<p class=3D"MsoNorm=
al" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 <span style=3D"color:blue;">void</span> ProcessPhotosWor=
ker_ProgressChanged(<span style=3D"color:blue;">object</span> sender, <span=
style=3D"color:#2B91AF;">ProgressChangedEventArgs</span>=0Ae)</span></p> =
=0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 {</span></p> =0A=0A<p class=3D"M=
soNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:blu=
e;">int</span> dispatcherHash =3D <span style=3D"color:#2B91AF;">Dispatcher=
</span>.CurrentDispatcher.Thread.GetHashCode();</span></p> =0A=0A<p class=
=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:=
blue;">bool</span> isBackGround =3D <span style=3D"color:#2B91AF;">Dispatch=
er</span>.CurrentDispatcher.Thread.IsBackground;</span></p> =0A=0A<p class=
=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:=
blue;">int</span> id =3D <span style=3D"color:#2B91AF;">Dispatcher</span>.C=
urrentDispatcher.Thread.ManagedThreadId;</span></p> =0A=0A<p class=3D"MsoNo=
rmal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=0A=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0<span style=3D"color:#2B91AF;"=
>ApartmentState</span>=0Athread_state =3D <span style=3D"color:#2B91AF;">Di=
spatcher</span>.CurrentDispatcher.Thread.GetApartmentState();</span></p> =
=0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span =
style=3D"color:#2B91AF;">Console</span>.WriteLine(<span style=3D"color:#2B9=
1AF;">MethodInfo</span>.GetCurrentMethod().Name=0A+ e.UserState.ToString())=
;</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-si=
ze:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=0A<span style=3D"color:#2B91AF;">Console</span>.WriteLine(<span style=
=3D"color:#A31515;">"=C2=A0=C2=A0=C2=A0=C2=A0=0ADispatcherHash:{0}, IsBackg=
round:{1}, Id:{2}, ThreadState:{3}"</span>,=0AdispatcherHash, isBackGround,=
id, thread_state);</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><spa=
n style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }<=
/span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size=
:10.0pt;"> =C2=A0</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span =
style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <spa=
n style=3D"color:blue;">private</span> <span style=3D"color:blue;">void</sp=
an>=0AProcessPhotosWorker_DoWork(<span style=3D"color:blue;">object</span> =
sender, <span style=3D"color:#2B91AF;">DoWorkEventArgs</span> e)</span></p>=
=0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 {</span></p> =0A=0A<p class=3D"M=
soNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:blu=
e;">int</span> dispatcherHash =3D <span style=3D"color:#2B91AF;">Dispatcher=
</span>.CurrentDispatcher.Thread.GetHashCode();</span></p> =0A=0A<p class=
=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:=
blue;">bool</span> isBackGround =3D <span style=3D"color:#2B91AF;">Dispatch=
er</span>.CurrentDispatcher.Thread.IsBackground;</span></p> =0A=0A<p class=
=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:=
blue;">int</span> id =3D <span style=3D"color:#2B91AF;">Dispatcher</span>.C=
urrentDispatcher.Thread.ManagedThreadId;</span></p> =0A=0A<p class=3D"MsoNo=
rmal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:#2B91AF;"=
>ApartmentState</span> thread_state =3D <span style=3D"color:#2B91AF;">Disp=
atcher</span>.CurrentDispatcher.Thread.GetApartmentState();</span></p> =0A=
=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span sty=
le=3D"color:#2B91AF;">Console</span>.WriteLine(<span style=3D"color:#2B91AF=
;">MethodInfo</span>.GetCurrentMethod().Name);</span></p> =0A=0A<p class=3D=
"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:#2B=
91AF;">Console</span>.WriteLine(<span style=3D"color:#A31515;">"=C2=A0=C2=
=A0=C2=A0=C2=A0=0ADispatcherHash:{0}, IsBackground:{1}, Id:{2}, ThreadState=
:{3}"</span>,=0AdispatcherHash, isBackGround, id, thread_state);</span></p>=
=0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=
=C2=A0</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"f=
ont-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=0A_worker.ReportProgress(25, <span style=3D"color:#A31515;">"25%d=
one"</span>);</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span styl=
e=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=0A<span style=3D"color:#2B91AF;">Thread</span>.Sleep(1000);=
</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-siz=
e:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=0A_worker.ReportProgress(50, <span style=3D"color:#A31515;">"50%done"</=
span>);</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"f=
ont-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=0A<span style=3D"color:#2B91AF;">Thread</span>.Sleep(1000);</span=
></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0=
pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A_=
worker.ReportProgress(75, <span style=3D"color:#A31515;">"75%done"</span>);=
</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-siz=
e:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=0A<span style=3D"color:#2B91AF;">Thread</span>.Sleep(1000);</span></p> =
=0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A_worke=
r.ReportProgress(100, <span style=3D"color:#A31515;">"100%done"</span>);</s=
pan></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:1=
0.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }</span></p> =0A=0A<p cl=
ass=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;"> =C2=A0</spa=
n></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.=
0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <span style=3D"color:blue;=
">void</span> ProcessPhotosWorker_RunWorkerCompleted(<span style=3D"color:b=
lue;">object</span> sender, <span style=3D"color:#2B91AF;">RunWorkerComplet=
edEventArgs</span>=0Ae)</span></p> =0A=0A<p class=3D"MsoNormal" style=3D"">=
<span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0 {</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"fon=
t-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=0A<span style=3D"color:blue;">int</span> dispatcherHash =3D <span=
style=3D"color:#2B91AF;">Dispatcher</span>.CurrentDispatcher.Thread.GetHas=
hCode();</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"=
font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=0A<span style=3D"color:blue;">bool</span> isBackGround =3D <sp=
an style=3D"color:#2B91AF;">Dispatcher</span>.CurrentDispatcher.Thread.IsBa=
ckground;</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D=
"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=0A<span style=3D"color:blue;">int</span> id =3D <span style=3D=
"color:#2B91AF;">Dispatcher</span>.CurrentDispatcher.Thread.ManagedThreadId=
;</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-si=
ze:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=0A<span style=3D"color:#2B91AF;">ApartmentState</span> thread_state =3D=
<span style=3D"color:#2B91AF;">Dispatcher</span>.CurrentDispatcher.Thread.=
GetApartmentState();</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><sp=
an style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:#2B91AF;">Console</span>.Wr=
iteLine(<span style=3D"color:#2B91AF;">MethodInfo</span>.GetCurrentMethod()=
.Name);</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"f=
ont-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=0A<span style=3D"color:#2B91AF;">Console</span>.WriteLine(<span s=
tyle=3D"color:#A31515;">"=C2=A0=C2=A0=C2=A0=C2=A0=0ADispatcherHash:{0}, IsB=
ackground:{1}, Id:{2}, ThreadState:{3}"</span>,=0AdispatcherHash, isBackGro=
und, id, thread_state);</span></p> =0A=0A<p class=3D"MsoNormal" style=3D"">=
<span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0 }</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"fon=
t-size:10.0pt;"> =C2=A0</span></p> =0A=0A<p class=3D"MsoNormal" style=3D"">=
<span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0 <span style=3D"color:blue;">public</span> <span style=3D"color:blue;">v=
oid</span>=0ARunBackgroundWorker()</span></p> =0A=0A<p class=3D"MsoNormal" =
style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0 {</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span sty=
le=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:blue;">int</span> dispatcherHash =
=3D <span style=3D"color:#2B91AF;">Dispatcher</span>.CurrentDispatcher.Thre=
ad.GetHashCode();</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span =
style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:blue;">bool</span> isBackGroun=
d =3D <span style=3D"color:#2B91AF;">Dispatcher</span>.CurrentDispatcher.Th=
read.IsBackground;</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span=
style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:blue;">int</span> id =3D <span=
style=3D"color:#2B91AF;">Dispatcher</span>.CurrentDispatcher.Thread.Manage=
dThreadId;</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=
=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=0A<span style=3D"color:#2B91AF;">ApartmentState</span> thre=
ad_state =3D <span style=3D"color:#2B91AF;">Dispatcher</span>.CurrentDispat=
cher.Thread.GetApartmentState();</span></p> =0A=0A<p class=3D"MsoNormal" st=
yle=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:#2B91AF;">Conso=
le</span>.WriteLine(<span style=3D"color:#2B91AF;">MethodInfo</span>.GetCur=
rentMethod().Name);</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><spa=
n style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=0A<span style=3D"color:#2B91AF;">Console</span>.Write=
Line(<span style=3D"color:#A31515;">"=C2=A0=C2=A0=C2=A0=C2=A0=0ADispatcherH=
ash:{0}, IsBackground:{1}, Id:{2}, ThreadState:{3}"</span>,=0AdispatcherHas=
h, isBackGround, id, thread_state);</span></p> =0A=0A<p class=3D"MsoNormal"=
style=3D""><span style=3D"font-size:10.0pt;"> =C2=A0</span></p> =0A=0A<p c=
lass=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=0A_worker.R=
unWorkerAsync(<span style=3D"color:#A31515;">"TestData"</span>);</span></p>=
=0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-size:10.0pt;">=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }</span></p> =0A=0A<p class=3D"M=
soNormal" style=3D""><span style=3D"font-size:10.0pt;">=C2=A0=C2=A0=C2=A0 }=
</span></p> =0A=0A<p class=3D"MsoNormal" style=3D""><span style=3D"font-siz=
e:10.0pt;">}</span></p> =0A=0A<p class=3D"MsoNormal"><span lang=3D"EN-AU" s=
tyle=3D""> =C2=A0</span></p></div><div style=3D""></div></div><br>=0A=0A=0A=
=0A=0A </div></div><div style=3D""></div></div><br>=0A=0A=0A=0A=0A =
</div></div><div style=3D"position:fixed"></div></div><br>=0A=0A=0A=0A=0A=
</body></html>
--0-1800158045-1222261269=:1490--
--===============5638425636642634651==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
--===============5638425636642634651==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
Nunit-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/nunit-users
--===============5638425636642634651==--