博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程同步与异步
阅读量:4990 次
发布时间:2019-06-12

本文共 14885 字,大约阅读时间需要 49 分钟。

 
代码
 
1
using
System;
2
 
using
System.Collections.Generic;
3
using
System.Linq;
4
using
System.Text;
5
using
System.Reflection;
6
using
System.Threading;
7
8
namespace
AppDomain_test
9
{
10
class
Program
11
{
12
#region
Test1
13
14
//
static void Main(string[] args)
15
//
{
16
//
#region AppDomain_test1
17
//
//
AppDomain curAppDomain = AppDomain.CurrentDomain;
18
//
//
foreach (Assembly assembly in curAppDomain.GetAssemblies())
19
//
//
{
20
//
//
Console.WriteLine(assembly.FullName);
21
//
//
}
22
//
#endregion
23
24
//
#region domain1
25
//
//
Console.WriteLine("Thread :{0} Hi from the domain:{1}", Thread.CurrentThread.Name, AppDomain.CurrentDomain.FriendlyName);
26
//
#endregion
27
28
//
#region CallingConventions
29
30
//
//
Thread.CurrentThread.Name = "MyThread";
31
32
//
//
AppDomainSetup info = new AppDomainSetup();
33
//
//
info.ApplicationBase = "file:
//
" + Environment.CurrentDirectory;
34
//
//
AppDomain newDomain = AppDomain.CreateDomain("NewDomain", null, info);
35
//
//
Console.WriteLine("Thread{0} Calling ExecuteAssembly() from appdomain{1}", Thread.CurrentThread.Name, AppDomain.CurrentDomain.FriendlyName);
36
//
//
newDomain.ExecuteAssembly("AssemblyToLoad.exe");
37
//
//
AppDomain.Unload(newDomain);
38
//
#endregion
39
40
//
#region 在其他AppDomain 的上下文中运行代码
41
//
//
Thread.CurrentThread.Name = "MyThread";
42
//
//
AppDomain newDomain = AppDomain.CreateDomain("NewDomain");
43
//
//
CrossAppDomainDelegate deleg = new CrossAppDomainDelegate(Fct);
44
//
//
newDomain.DoCallBack(deleg);
45
//
//
AppDomain.Unload(newDomain);
46
//
#endregion
47
//
}
48
49
//
#region 在其他AppDomain 的上下文中运行代码
50
///
/public static void Fct()
51
///
/{
52
///
/ Console.WriteLine("Thread:{0} execute Fct() inside the appdomain{1}",
53
///
/ Thread.CurrentThread.Name, AppDomain.CurrentDomain.FriendlyName);
54
///
/}
55
//
#endregion
56
#endregion
57
58
#region
Test2
59
public
static
void
Main()
60
{
61
AppDomain newDomain
=
AppDomain.CreateDomain(
"
NewDomain
"
);
62
CrossAppDomainDelegate deleg
=
new
CrossAppDomainDelegate(Fct);
63
64
newDomain.DoCallBack(deleg);
65
int
anInteger
=
(
int
)newDomain.GetData(
"
AnInteger
"
);
66
AppDomain.Unload(newDomain);
67
}
68
69
public
static
void
Fct()
70
{
71
AppDomain.CurrentDomain.SetData(
"
AnInteger
"
,
691
);
72
}
73
#endregion
74
75
76
77
78
}
79
80
81
}
82
83
84
85
using
System;
86
using
System.Collections.Generic;
87
using
System.Linq;
88
using
System.Text;
89
using
System.Diagnostics;
90
using
System.Threading;
91
using
System.IO;
92
using
System.Runtime.Remoting.Contexts;
93
94
namespace
Thead_Test
95
{
96
class
Program
97
{
98
#region
start notepad
99
//
static void Main(string[] args)
100
//
{
101
//
Process process = Process.Start("notepad.exe", "hello.txt");
102
103
//
Thread.Sleep(10000);
104
//
process.Kill();
105
//
}
106
#endregion
107
108
#region
Join
109
//
static long counter = 1;
110
//
static void Main(string[] args)
111
//
{
112
//
Thread t1 = new Thread(f1);
113
//
Thread t2 = new Thread(f2);
114
//
t1.Start();
115
//
t2.Start();
116
//
t1.Join();
117
//
t2.Join();
118
119
//
}
120
121
//
static void f1()
122
//
{
123
//
for (int i = 0; i < 5;i++ )
124
//
{
125
//
Interlocked.Increment(ref counter);
126
//
Console.WriteLine("counter++ {0}", counter);
127
//
Thread.Sleep(10);
128
//
}
129
//
}
130
131
//
static void f2()
132
//
{
133
//
for (int i = 0; i < 5; i++)
134
//
{
135
//
Interlocked.Decrement(ref counter);
136
//
Console.WriteLine("counter-- {0}", counter);
137
//
Thread.Sleep(10);
138
//
}
139
//
}
140
#endregion
141
142
#region
Monitor_Enter_Exit
143
144
//
static long counter = 1;
145
//
static void Main(string[] args)
146
//
{
147
//
Thread t1 = new Thread(f1);
148
//
Thread t2 = new Thread(f2);
149
//
t1.Start();
150
//
t2.Start();
151
//
t1.Join();
152
//
t2.Join();
153
154
//
}
155
156
//
static void f1()
157
//
{
158
//
for (int i = 0; i < 5; i++)
159
//
{
160
//
Monitor.Enter(typeof(Program));
161
//
try
162
//
{
163
//
counter *= counter;
164
//
}
165
//
finally
166
//
{
167
//
Monitor.Exit(typeof(Program));
168
//
}
169
170
//
Thread.Sleep(10);
171
//
}
172
//
}
173
174
//
static void f2()
175
//
{
176
//
for (int i = 0; i < 5; i++)
177
//
{
178
//
Monitor.Enter(typeof(Program));
179
//
try
180
//
{
181
//
counter *= 2;
182
//
}
183
//
finally
184
//
{
185
//
Monitor.Exit(typeof(Program));
186
//
}
187
//
Console.WriteLine("counter *2{0}", counter);
188
//
Thread.Sleep(10);
189
//
}
190
//
}
191
#endregion
192
193
#region
Lock
194
195
//
static long counter = 1;
196
//
static void Main(string[] args)
197
//
{
198
//
Thread t1 = new Thread(f1);
199
//
Thread t2 = new Thread(f2);
200
//
t1.Start();
201
//
t2.Start();
202
//
t1.Join();
203
//
t2.Join();
204
205
//
}
206
207
//
static void f1()
208
//
{
209
//
for (int i = 0; i < 5; i++)
210
//
{
211
//
lock (typeof(Program)) ;
212
//
{
213
//
counter *= counter;
214
//
}
215
//
Console.WriteLine("counter ^2{0}", counter);
216
//
Thread.Sleep(10);
217
//
}
218
//
}
219
220
//
static void f2()
221
//
{
222
//
for (int i = 0; i < 5; i++)
223
//
{
224
//
lock(typeof(Program));
225
//
{
226
//
counter *= 2;
227
//
}
228
//
Console.WriteLine("counter *2{0}", counter);
229
//
Thread.Sleep(10);
230
//
}
231
//
}
232
#endregion
233
234
#region
SyncRoot
235
//
class Foo
236
//
{
237
//
private static object staticSyncRoot = new object();
238
//
private object instanceSyncRoot = new object();
239
//
public static void StaticFct()
240
//
{
241
//
lock(staticSyncRoot)
242
//
{
243
244
//
}
245
//
}
246
247
//
public static void InstanceFct()
248
//
{
249
//
lock(instanceSyncRoot)
250
//
{
251
252
//
}
253
//
}
254
//
}
255
#endregion
256
257
258
#region
线程包装(线程安全类)
259
//
class Foo
260
//
{
261
//
public virtual void Fct1(){}
262
//
public virtual void Fct2(){}
263
//
public virtual bool IsSynchronized{get{return false;}}
264
265
//
public static Foo Synchronized(Foo foo)
266
//
{
267
//
if (!foo.IsSynchronized)
268
//
{
269
//
return new FooSynchronized(foo);
270
//
}
271
//
return foo;
272
//
}
273
274
//
private class FooSynchronized:Foo
275
//
{
276
//
private object syncRoot =new object();
277
//
private Foo m_Foo;
278
//
public FooSynchronized(Foo foo){m_Foo =foo;}
279
//
public override bool IsSynchronized{get{return true;}}
280
//
public override void Fct1(){lock(syncRoot){m_Foo.Fct1();}}
281
//
public override void Fct2(){lock(syncRoot){m_Foo.Fct2();}}
282
//
}
283
//
}
284
#endregion
285
286
#region
测试TryEnter
287
//
private static object staticSyncRoot = new object();
288
//
static void Main()
289
//
{
290
//
Monitor.Enter(staticSyncRoot);
291
//
Thread t1 = new Thread(f1);
292
//
t1.Start();
293
//
t1.Join();
294
//
}
295
296
//
static void f1()
297
//
{
298
//
if (!Monitor.TryEnter(staticSyncRoot))
299
//
{
300
//
return;
301
//
}
302
//
try
303
//
{
304
305
//
}
306
//
finally
307
//
{
308
//
Monitor.Exit(staticSyncRoot);
309
//
}
310
//
}
311
#endregion
312
313
#region
wait_pulse_lock
314
//
static object ball = new object();
315
//
public static void Main()
316
//
{
317
//
Thread threadPing = new Thread(ThreadPingProc);
318
//
Thread threadPong = new Thread(ThreadPongProc);
319
//
threadPing.Start();
320
//
threadPong.Start();
321
//
threadPing.Join();
322
//
threadPong.Join();
323
//
}
324
325
//
static void ThreadPongProc()
326
//
{
327
//
Console.WriteLine("ThreadPong Hello");
328
//
lock(ball)
329
//
{
330
//
for (int i = 0; i < 5;i++ )
331
//
{
332
//
Console.WriteLine("ThreadPong: Pong");
333
//
Monitor.Pulse(ball);
334
//
Monitor.Wait(ball);
335
//
}
336
//
}
337
//
Console.WriteLine("ThreadPong:Bye!");
338
//
}
339
340
//
static void ThreadPingProc()
341
//
{
342
//
Console.WriteLine("ThreadPing Hello");
343
//
lock (ball)
344
//
{
345
//
for (int i = 0; i < 5; i++)
346
//
{
347
//
Console.WriteLine("ThreadPing: Ping");
348
//
Monitor.Pulse(ball);
349
//
Monitor.Wait(ball);
350
//
}
351
//
}
352
//
Console.WriteLine("ThreadPing:Bye!");
353
//
}
354
#endregion
355
356
#region
Mutex
357
//
static void Main()
358
//
{
359
360
//
Mutex mutexFile = new Mutex(false, "MutexTest");
361
//
for (int i =0;i<10;i++)
362
//
{
363
//
mutexFile.WaitOne();
364
365
//
FileInfo fi = new FileInfo("tmp.txt");
366
//
StreamWriter sw = fi.AppendText();
367
//
sw.WriteLine("Hello{0}", i);
368
//
sw.Flush();
369
//
sw.Close();
370
//
System.Console.WriteLine("Hello {0}", i);
371
//
Thread.Sleep(1000);
372
373
//
mutexFile.ReleaseMutex();
374
//
}
375
//
mutexFile.Close();
376
//
}
377
#endregion
378
379
#region
event EventHandler
380
//
static EventHandler[] events;
381
//
static void Main()
382
//
{
383
//
events = new EventWaitHandle[2];
384
385
//
events[0] = new EventWaitHandle(false, EventResetMode.AutoReset);
386
//
events[1] = new EventWaitHandle(false, EventResetMode.AutoReset);
387
//
Thread t0 = new Thread(ThreadProc0);
388
//
Thread t1 = new Thread(ThreadProc1);
389
//
t0.Start();
390
//
t1.Start();
391
//
AutoResetEvent.WaitAll(events);
392
//
Console.WriteLine("MainThread:Thread0 reached 2" + "and Thread1 reached 3.");
393
//
t0.Join();
394
//
t1.Join();
395
//
}
396
397
//
static void ThreadProc1()
398
//
{
399
//
for (int i = 0; i < 5;i++ )
400
//
{
401
//
Console.WriteLine("Thread0:{0}", i);
402
//
if (i==2)
403
//
{
404
//
events[0].Set();
405
//
}
406
//
Thread.Sleep(100);
407
//
}
408
//
}
409
410
//
static void ThreadProc2()
411
//
{
412
//
for (int i = 0; i < 5; i++)
413
//
{
414
//
Console.WriteLine("Thread0:{0}", i);
415
//
if (i == 3)
416
//
{
417
//
events[1].Set();
418
//
}
419
//
Thread.Sleep(60);
420
//
}
421
//
}
422
#endregion
423
424
#region
Thread.semmSemaphore
425
426
//
static Semaphore semaphore;
427
//
static void Main()
428
//
{
429
//
semaphore = new Semaphore(2, 5);
430
//
for (int i = 0; i < 3;i++ )
431
//
{
432
//
Thread t = new Thread(WorkerProc);
433
//
t.Name = "Thread" + i;
434
//
t.Start();
435
//
Thread.Sleep(30);
436
//
}
437
438
//
}
439
440
//
static void WorkerProc()
441
//
{
442
//
for (int j = 0; j < 3;j++ )
443
//
{
444
//
semaphore.WaitOne();
445
//
Console.WriteLine(Thread.CurrentThread.Name + ":Begin");
446
//
Thread.Sleep(200);
447
//
Console.WriteLine(Thread.CurrentThread.Name + ":End");
448
//
semaphore.Release();
449
//
}
450
//
}
451
#endregion
452
453
#region
ReaderWriterLock
454
//
static int theResource = 0;
455
//
static ReaderWriterLock rw1 = new ReaderWriterLock();
456
//
static void Main()
457
//
{
458
//
Thread tr0 = new Thread(ThreadReader);
459
//
Thread tr1 = new Thread(ThreadReader);
460
//
Thread tw = new Thread(ThreadWriter);
461
//
tr0.Start();
462
//
tr1.Start();
463
//
tw.Start();
464
//
tr0.Join();
465
//
tr1.Join();
466
//
tw.Join();
467
//
}
468
469
//
static void ThreadReader()
470
//
{
471
//
for (int i = 0; i < 3;i++ )
472
//
{
473
//
try
474
//
{
475
//
rw1.AcquireReaderLock(1000);
476
//
Console.WriteLine("Begin Read the Resource ={0}", theResource);
477
//
Thread.Sleep(10);
478
//
Console.WriteLine("End Read the resource ={0}", theResource);
479
//
rw1.ReleaseLock();
480
//
}
481
//
catch (System.Exception e)
482
//
{
483
484
//
}
485
//
}
486
//
}
487
488
//
static void ThreadWriter()
489
//
{
490
//
for (int i = 0; i < 3; i++)
491
//
{
492
//
try
493
//
{
494
//
rw1.AcquireWriterLock(1000);
495
//
Console.WriteLine("Begin write the Resource ={0}", theResource);
496
//
Thread.Sleep(100);
497
//
theResource++;
498
//
Console.WriteLine("End write the resource ={0}", theResource);
499
//
rw1.ReleaseWriterLock();
500
//
}
501
//
catch (System.Exception e)
502
//
{
503
504
//
}
505
//
}
506
//
}
507
#endregion
508
509
#region
SynchronizationAttribute.REQUIRED
510
//
[Synchronization(SynchronizationAttribute.REQUIRED)]
511
//
public class Foo: System.ContextBoundObject{
512
//
public void DisplayThreadId()
513
//
{
514
//
Console.WriteLine("Begin:ManagedThreadId =" +
515
//
Thread.CurrentThread.ManagedThreadId);
516
//
Thread.Sleep(1000);
517
//
Console.WriteLine("End: ManagedThreadId =" + Thread.CurrentThread.ManagedThreadId);
518
//
}
519
//
}
520
521
//
static Foo m_Object = new Foo();
522
//
static void Main()
523
//
{
524
//
Thread t0 = new Thread(ThreadProc);
525
//
Thread t1 = new Thread(ThreadProc);
526
//
t0.Start();
527
//
t1.Start();
528
//
t0.Join();
529
//
t1.Join();
530
531
//
}
532
533
//
static void ThreadProc()
534
//
{
535
//
for (int i = 0; i < 2;i++ )
536
//
{
537
//
m_Object.DisplayThreadId();
538
//
}
539
//
}
540
541
#endregion
542
543
#region
CurrentThread.ManagedThreadId
544
545
//
public static void Main()
546
//
{
547
//
ThreadPool.RegisterWaitForSingleObject(
548
//
new AutoResetEvent(false), new WaitOrTimerCallback(ThreadTaskWait), null, 2000, false);
549
//
for (int count = 0; count < 3; ++count)
550
//
{
551
//
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadTask), count);
552
//
Thread.Sleep(12000);
553
//
}
554
555
556
//
}
557
558
//
static void ThreadTask(object obj)
559
//
{
560
//
Console.WriteLine("Thread #{0} Task#{1} Begin", Thread.CurrentThread.ManagedThreadId, obj.ToString());
561
//
Thread.Sleep(5000);
562
//
Console.WriteLine("Thread #{0} Task#{1} End", Thread.CurrentThread.ManagedThreadId, obj.ToString());
563
564
//
}
565
566
//
static void ThreadTaskWait(object obj, bool signaled)
567
//
{
568
//
Console.WriteLine("Thread #{0} TaskWait", Thread.CurrentThread.ManagedThreadId);
569
//
}
570
#endregion
571
572
#region
异步委托
573
//
public delegate int Deleg(int a,int b);
574
//
static int WriteSum(int a,int b)
575
//
{
576
//
int sum =a +b;
577
//
Console.WriteLine("Thread #{0}:writeSum() sum ={1}",Thread.CurrentThread.ManagedThreadId,sum);
578
//
return sum ;
579
//
}
580
581
//
static void Main()
582
//
{
583
//
Deleg proc = WriteSum;
584
//
System.IAsyncResult async = proc.BeginInvoke(10, 10, null, null);
585
//
int sum = proc.EndInvoke(async);
586
//
System.Console.WriteLine("Thread#{0}:Main sum ={1}", Thread.CurrentThread.ManagedThreadId, sum);
587
//
}
588
#endregion
589
590
#region
异步委托
591
public
delegate
int
Deleg(
int
a,
int
b);
592
static
AutoResetEvent ev
=
new
AutoResetEvent(
false
);
593
static
int
WriteSum(
int
a,
int
b)
594
{
595
int
sum
=
a
+
b;
596
Console.WriteLine(
"
Thread #{0}:writeSum() sum ={1}
"
, Thread.CurrentThread.ManagedThreadId, sum);
597
return
sum;
598
}
599
600
static
void
SumDone(IAsyncResult async)
601
{
602
Thread.Sleep(
1000
);
603
Deleg proc
=
((IAsyncResult)async).AsyncDelegate
as
Deleg;
604
int
sum
=
proc.EndInvoke(async);
605
Console.WriteLine(
"
Thread #{0}:callback method sum ={1}
"
, Thread.CurrentThread.ManagedThreadId, sum);
606
ev.Set();
607
}
608
609
static
void
Main()
610
{
611
Deleg proc
=
WriteSum;
612
System.IAsyncResult async
=
proc.BeginInvoke(
10
,
10
,
null
,
null
);
613
int
sum
=
proc.EndInvoke(async);
614
System.Console.WriteLine(
"
Thread#{0}:Main sum ={1}
"
, Thread.CurrentThread.ManagedThreadId, sum);
615
}
616
#endregion
617
}
618
}
619
620

 

转载于:https://www.cnblogs.com/tianjinquan/archive/2010/12/10/1902630.html

你可能感兴趣的文章
poj 1113 Wall (凸包模板题)
查看>>
cf 535B Tavas and SaDDas
查看>>
OO-面对对象的特征--多态、抽象
查看>>
看准网免登陆查看
查看>>
用pygame实现打飞机游戏-1-搭建框架
查看>>
io编程,bio,nio,aio
查看>>
windows 关于时间的计算
查看>>
面向对象编程思想-代理模式
查看>>
HttpClient获取Cookie的两种方式
查看>>
Windows 7中的电源计划及维护
查看>>
Spring MVC 配置类 WebMvcConfigurerAdapter
查看>>
js获取url参数
查看>>
程序员如何优雅的挣零花钱?
查看>>
推荐 2 个简历模板及 2 大加分技巧
查看>>
关于伪类选择器中一个冒号和两个冒号的区别
查看>>
理解敏捷开发准则
查看>>
[beta cycle]daily scrum10_2.25
查看>>
【转载】和 Thrift 的一场美丽邂逅
查看>>
CM_RESOURCE_LIST structure 分类: wind...
查看>>
css单位pr,em,与颜色
查看>>