aaaa

时间:2019-06-12
本文章向大家介绍aaaa,主要包括aaaa使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

<div id="cnblogs_post_body" class="blogpost-body">原文:<a id="cb_post_title_url" class="singleposttitle" href="http://www.cnblogs.com/rogerroddick/archive/2012/12/27/2846693.html">C#多线程实现方法——Task/Task.Factary</a><p></p><h2>Task</h2>
<h3>使用</h3>
<p>Task以及Task.Factory都是在.Net 4引用的。Task跟Thread很类似,通过下面例子可以看到。</p>
<p>
</p><pre name="code" class="csharp"> static public void ThreadMain()
{
Thread t1 = new Thread(TaskWorker);
t1.Start(3);
}

static public void TaskMain()
{
Task t1 = new Task(TaskWorker, 3, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);
Console.WriteLine(t1.Status);
t1.Start();
t1.Wait(); // need to wait for finishing.
}

static public void TaskWorker(object state)
{
int nTime = (int)state;
for (int i = 0; i &lt; nTime; i++)
{
Thread.Sleep(100);
Console.WriteLine(string.Format("current thread {0} sleep for {1} miniseconds .", Task.CurrentId, (i + 1) * 100));
}
return;
}</pre>
<p>我们看到TaskWorker都是用于Task以及Thread,都是只能接受一个参数(Action&lt;object&gt;),不过task可以支持工作函数具有返回值(Func&lt;TRessult&gt;()或者Func&lt;object, TResult&gt;)。但是弱的类型输入跟thread一样。Task提供返回值是为了后面说到的task结构层次有用。</p>
<p>下面是调用一个具有返回值的工作函数</p>
<p>
</p><pre name="code" class="cpp"> static public int TaskWorkerWithReturn(object state)
{
int nTime = (int)state;
for (int i = 0; i &lt; nTime; i++)
{
Thread.Sleep(100);
Console.WriteLine(string.Format("current thread {0} sleep for {1} miniseconds .", Task.CurrentId, (i + 1) * 100));
}
nTime++;
return nTime;
}</pre><pre name="code" class="cpp"></pre><p>主调函数为:</p><p></p><pre name="code" class="csharp"> Task&lt;int&gt; t2 = new Task&lt;int&gt;(TaskWorkerWithReturn, 3, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);
t2.Start();
t2.Wait();
Console.WriteLine(t2.Result);</pre>不管从工作函数是否有返回值,task都需要在其运行过程中至少有一个前台线程在跑,否则会直接退出,根本原因是所有task都是后台线程。task的工作函数的输入参数类型职能是object。
<p>
</p><p>
</p><h3>同步</h3>
<p>对于没有返回值的工作函数需要通过内核对象来同步主调线程(例如task内置的事件,使用wait来阻塞等待);</p>
<p>对于有返回值的工作函数可以通过访问其Result函数来实现阻塞等待。</p>
<p>
</p><pre name="code" class="csharp"> static public int TaskWorkerWithReturn(object state)
{
int nTime = (int)state;
for (int i = 0; i &lt; nTime; i++)
{
Thread.Sleep(100);
Console.WriteLine(string.Format("current thread {0} sleep for {1} miniseconds .", Task.CurrentId, (i + 1) * 100));
}
nTime++;
return nTime;
}</pre>
<p>主调函数:</p>
<p>
</p><pre name="code" class="csharp"> Task&lt;int&gt; t2 = new Task&lt;int&gt;(TaskWorkerWithReturn, 3, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);
t2.Start();
Console.WriteLine("t2:" + t2.Result);</pre>
<p>
</p><h3>异步调用</h3>
<p>
</p><p>作为新的一个特性在.net 4中引入,task能实现丰富的异步调用,使用成员函数ContinueWith来响应异步工作函数的完成,<strong>注意,不一定由之前完成异步函数的线程执行</strong>。</p>
<p></p><pre name="code" class="csharp"> static public void TaskMain()
{
Task&lt;int&gt; t3 = new Task&lt;int&gt;(FirstTask, 1);
t3.Start();
Task&lt;int&gt; t4 = t3.ContinueWith&lt;int&gt;(RecusiveTask);
Task&lt;int&gt; t5 = t4.ContinueWith&lt;int&gt;(RecusiveTask);
Task&lt;int&gt; t6 = t5.ContinueWith&lt;int&gt;(RecusiveTask).ContinueWith&lt;int&gt;(RecusiveTask);
//Console.WriteLine(string.Format("final result: {0}", t6.Result));
}

static public int FirstTask(object state)
{
int data = (int)state;
for (int i = 0; i &lt; data; i++)
{
Thread.Sleep(100);
Console.WriteLine(string.Format("current thread {0} slept for {1} milisecond.", Task.CurrentId, (i + 1) * 100));
}
data++;
return data;
}

static public int RecusiveTask(Task&lt;int&gt; T)
{
int data = T.Result;
for (int i = 0; i &lt; data; i++)
{
Thread.Sleep(100);
Console.WriteLine(string.Format("current thread {0} slept for {1} milisecond.", Task.CurrentId, (i + 1) * 100));
}
data++;
return data;
}</pre>输出结果为:<p></p>
<p></p><pre name="code" class="plain">current thread 1 slept for 100 milisecond.
current thread 2 slept for 100 milisecond.
current thread 2 slept for 200 milisecond.
current thread 3 slept for 100 milisecond.
current thread 3 slept for 200 milisecond.
current thread 3 slept for 300 milisecond.
current thread 4 slept for 100 milisecond.
current thread 4 slept for 200 milisecond.
current thread 4 slept for 300 milisecond.
current thread 4 slept for 400 milisecond.
current thread 5 slept for 100 milisecond.
current thread 5 slept for 200 milisecond.
current thread 5 slept for 300 milisecond.
current thread 5 slept for 400 milisecond.
current thread 5 slept for 500 milisecond.
final result: 6
请按任意键继续. . .</pre><br>
<br>
<p></p>
<p><br>
<br>
</p>
<p>
</p><p><br>
</p>
<p><br>
</p>
<p><br>
</p>
<p><br>
</p>
<p><br>
</p>
<p><br>
</p>
<p>
</p><p><br>
</p>
<p><br>
</p>
<p><br>
</p></div>

原文地址:https://www.cnblogs.com/owenzh/p/11010928.html