Добавить в цитаты Настройки чтения

Страница 424 из 502

<b>using System;</b>

<b>using System.Threading;</b>

<b>using System.Threading.Tasks;</b>

<b>class MyClass {</b>

<b>  // Метод выполняемый в качестве задачи,</b>

<b>  public void MyTask() {</b>

<b>    Console.WriteLine(&quot;MyTask() запущен&quot;);</b>

<b>    for(int count = 0; count &lt; 10; count++) {</b>

<b>      Thread.Sleep(500);</b>

<b>      Console.WriteLine(&quot;В методе MyTask(), подсчет равен &quot; + count);</b>

<b>    }</b>

<b>    Console.WriteLine(&quot;MyTask завершен &quot;);</b>

<b>  }</b>

<b>}</b>

<b>class DemoTask {</b>

<b>  static void Main() {</b>

<b>    Console.WriteLine(&quot;Основной поток запущен.&quot;);</b>

<b>    // Сконструировать объект типа MyClass.</b>

<b>    MyClass me = new MyClass();</b>

<b>    // Сконструировать объект задачи для метода mc.MyTask().</b>

<b>    Task tsk = new Task(me.MyTask);</b>

<b>    // Запустить задачу на исполнение,</b>

<b>    tsk.Start();</b>

<b>    // Сохранить метод Main() активным до завершения метода MyTask().</b>

<b>    for(int i = 0; i &lt; 60; i++) {</b>

<b>      Console.Write (&quot;.&quot;);</b>

<b>      Thread.Sleep (100);</b>

<b>    }</b>

<b>    Console.WriteLine(&quot;Основной поток завершен.&quot;);</b>

<b>  }</b>

<b>}</b>

Результат выполнения этой программы получается таким же, как и прежде. Единственное отличие состоит в том, что метод MyTask() вызывается теперь для экземпляра объекта класса MyClass.

В отношении задач необходимо также иметь в виду следующее: после того, как задача завершена, она не может быть перезапущена. Следовательно, иного способа повторного запуска задачи на исполнение, кроме создания ее снова, не существует.

В отличие от класса Thread; в классе Task отсутствует свойство Name для хранения имени задачи. Но вместо этого в нем имеется свойство Id для хранения идентификатора задачи, по которому можно распознавать задачи. Свойство Id доступно только для чтения и относится к типу int. Оно объявляется следующим образом.

<b>public int Id { get; }</b>

Каждая задача получает идентификатор, когда она создается. Значения идентификаторов уникальны, но не упорядочены. Поэтому один идентификатор задачи может появиться перед другим, хотя он может и не иметь меньшее значение.

Идентификатор исполняемой в настоящий момент задачи можно выявить с помощью свойства CurrentId. Это свойство доступно только для чтения, относится к типу static и объявляется следующим образом.

<b>public static Nullable&lt;int&gt; CurrentID { get; }</b>

Оно возвращает исполняемую в настоящий момент задачу или же пустое значение, если вызывающий код не является задачей.

В приведенном ниже примере программы создаются две задачи и показывается, какая из них исполняется.

<b>// Продемонстрировать применение свойств Id и CurrentId.</b>

<b>using System;</b>

<b>using System.Threading;</b>

<b>using System.Threading.Tasks;</b>

<b>class DemoTask {</b>

<b>  // Метод, исполняемый как задача,</b>

<b>  static void MyTask() {</b>

<b>    Console.WriteLine(&quot;MyTask() №&quot; + Task.CurrentId + &quot; запущен&quot;);</b>

<b>    for (int count = 0; count &lt; 10; count++) {</b>

<b>      Thread.Sleep(500);</b>

<b>      Console.WriteLine(&quot;В методе MyTaskO #&quot; + Task.CurrentId +</b>

<b>           &quot;, подсчет равен &quot; + count );</b>

<b>    }</b>

<b>    Console.WriteLine(&quot;MyTask №&quot; + Task.CurrentId + &quot; завершен&quot;);</b>

<b>  }</b>

<b>  static void Main() {</b>

<b>    Console.WriteLine(&quot;Основной поток запущен.&quot;);</b>

<b>    // Сконструировать объекты двух задач.</b>

<b>    Task tsk = new Task(MyTask);</b>

<b>    Task tsk2 = new Task(MyTask);</b>

<b>    // Запустить задачи на исполнение,</b>

<b>    tsk.Start();</b>