using System.Threading;

 1         /// <summary>
 2         /// 执行动作:耗时而已
 3         /// </summary>
 4         private void TestThread(string threadName)
 5         {
 6             Console.WriteLine("TestThread Start  Name={2}当前线程的id:{0},当前时间为{1},",
 7                 System.Threading.Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"), threadName);
 8             long sum = 0;
 9             for (int i = 1; i < 999999999; i++)
10             {
11                 sum += i;
12             }
13             //Thread.Sleep(1000);
14             Console.WriteLine("TestThread End  Name={2}当前线程的id:{0},当前时间为{1},计算结果{3}",
15                 System.Threading.Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"), threadName, sum);
16         }

TestThread

同步方法

 1         private void btnSync_Click(object sender, EventArgs e)
 2         {
 3             Stopwatch watch = new Stopwatch();
 4             watch.Start();
 5
 6             Console.WriteLine();
 7             Console.WriteLine("*********************************btnSync_Click Start*********************************************");
 8             Console.WriteLine("btnSync_Click当前主线程的id:{0}", Thread.CurrentThread.ManagedThreadId);
 9
10             for (int i = 0; i < 5; i++)
11             {
12                 string name = string.Format("btnSync_Click_{0}", i);
13                 TestThread(name);
14             }
15             watch.Stop();
16             Console.WriteLine("*********************************btnSync_Click End {0}********************************************", watch.ElapsedMilliseconds);
17             Console.WriteLine();
18
19         }    

异步调用

1 异步调用
2 1 同步方法会卡界面,异步多线程不会,原因:同步方法占用了UI线程,无法响应其他操作;异步多线程,UI线程不需要等待计算,计算由子线程完成
3 2 同步方法慢,只有主线程计算;异步方法快,启动了多个线程同时计算,会占用更多的资源(多线程的调度管理,也是需要消耗资源的)
4 3 异步方法的启动和执行时无序,原因:线程的申请是无序获取;不同线程同一个任务的执行速度也不一定相同;
 1        Stopwatch watch = new Stopwatch();
 2             watch.Start();
 3
 4             Console.WriteLine();
 5             Console.WriteLine("*********************************btnAsync_Click Start*********************************************");
 6             Console.WriteLine("btnAsync_Click当前主线程的id:{0}", Thread.CurrentThread.ManagedThreadId);
 7
 8             List<IAsyncResult> asyncResultList = new List<IAsyncResult>();
 9
10             for (int i = 0; i < 5; i++)
11             {
12                 string name = string.Format("btnSync_Click_{0}", i);
13                 Action<string> act = TestThread;
14                 //act.Invoke(name);
15                 asyncResultList.Add(act.BeginInvoke(name, null, null));
16                 //Thread.Sleep(1);
17             }
18           watch.Stop();
19
20             Console.WriteLine("*********************************btnAsync_Click End {0}********************************************", watch.ElapsedMilliseconds);
21             Console.WriteLine();    

等待:

1             foreach (var item in asyncResultList)
2             {
3                 item.AsyncWaitHandle.WaitOne();
4             }
5 或者
6             while (asyncResultList.Count(r => r.IsCompleted) < 5)
7             {
8                 Thread.Sleep(100);//主线程等待着
9             }

共有资源的访问

private int IntValue = 0;
private static object IntValueLock = new object();
 1        for (int i = 0; i < 10000; i++)
 2             {
 3                 IntValue++;
 4             }
 5
 6             Action act = () =>
 7                 {
 8                     lock (IntValueLock)
 9                     {
10                         IntValue++;
11                         Console.WriteLine(IntValue.ToString());
12                     }
13                 };
14             for (int i = 0; i < 10000; i++)
15             {
16                 act.BeginInvoke(null, null);
17             }
时间: 2024-10-03 09:04:05

using System.Threading;的相关文章

System.Threading

线程:定义为可执行应用程序中的基本执行单元. 应用程序域:一个应用程序内可能有多个线程. 上下文:一个线程可以移动到一个特定的上下文的实体 导入命名空间: //得到正在执行这个方法的线程 Thread currThread = Thread.CurrentThread; //获取正在承载当前线程的应用程序 AppDomain ad = Thread.GetDomain(); //获取当前操作线程所处的上下文 System.Runtime.Remoting.Contexts.Context ct

vs2013c#测试using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1_CXY { class Program { stati

首先安装Unit Test Generator.方法为:工具->扩展和更新->联机->搜索“图标为装有蓝色液体的小试管.Unit Test Generator”, 编写代码,生成一个新的类,编写构造函数 与 add()函数.代码如下. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Co

System.Threading.ThreadStateException

异常:"System.Threading.ThreadStateException"在未处理的异常类型 System.Windows.Forms.dll 发生 其它信息: 在能够调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 仅仅有将调试器附加到该进程才会引发此异常. 分析:线程间操作产生的异常. 解决方式1:Control.CheckForIllegalCrossThreadCalls =

System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的差别和分别什么时候用

一.System.Windows.Forms.Timer 1.基于Windows消息循环,用事件方式触发,在界面线程执行:是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler.在这种Timer的EventHandler中可 以直接获取和修改UI元素而不会出现问题--因为这种Timer实际上就是在UI线程自身上进行调用的. 2.它是一个基于Form的计时器3.创建之后,你可以使用Interval设置Tick之间的跨

Delphi并行库System.Threading 之ITask 1

不知什么时候,也许是XE8,也许是XE8之前 .Delphi里面多了个System.Threading的并行库. 虽然己经有非常棒的第三方并行库QWorker,但我还是更喜欢官方的东西. 下面是一段使用System.Threading中ITask的代码 procedure TForm3.SpeedButton1Click(Sender: TObject); var tasks: array of ITask; value: Integer; LTask:ITask; X,Y:INTEGER; b

System.Threading.Timer

GLog.WLog("_thdTimer before"); _thdTimer = new System.Threading.Timer(new TimerCallback(TimerProc)); //2秒后开始执行计时器:每3秒执行一次 _thdTimer.Change(2000,3000); GLog.WLog("_thdTimer after"); private void TimerProc(object state) { try { GLog.WLog

C#错误之 System.Threading.ThreadAbortException:正在中止线程

参考:http://www.cnblogs.com/chendaoyin/archive/2013/06/27/3159211.html 1.开启一个子线程 1 //开启一个子线程,子线程调用方法 Method 2 Thread th = new Thread(Method); 3 th.IsBackground = true; 4 th.Start(); 2.线程处理函数 1 public void Method() 2 { 3 try 4 { } 5 catch(Exception ex)

例说定时器System.Threading.Timer

本文通过实例演示System.Threading.Timer的使用方法. 下面是完整的实例代码. using System; using System.Windows; namespace ThreadingTimerExp { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { System.Threading.Timer timer;

System.Threading.Timer 用法

System.Threading.Timer用法和例子 (1)首先声明Timer变量://一定要声明成局部变量以保持对Timer的引用,否则会被垃圾收集器回收!private System.Threading.Timer timerClose; (2)在上述自动执行代码后面添加如下Timer实例化代码:// Create a timer thread and start ittimerClose = new System.Threading.Timer(new TimerCallback(tim