Перейти к содержимому

System task что это

  • автор:

Task Класс

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Представляет асинхронную операцию.

public ref class Task : IAsyncResult
public ref class Task : IAsyncResult, IDisposable
public class Task : IAsyncResult
public class Task : IAsyncResult, IDisposable
type Task = class interface IAsyncResult
type Task = class interface IAsyncResult interface IDisposable
Public Class Task Implements IAsyncResult
Public Class Task Implements IAsyncResult, IDisposable

Наследование
Производный
Реализации

Комментарии

Класс Task представляет одну операцию, которая не возвращает значение и обычно выполняется асинхронно. TaskОбъекты являются одним из центральных компонентов асинхронной модели на основе задач, впервые представленной в платформа .NET Framework 4. Поскольку работа, выполняемая Task объектом, обычно выполняется асинхронно в потоке пула потоков, а не синхронно в потоке main приложения, для определения состояния задачи можно использовать Status свойство , а также IsCanceledсвойства , IsCompletedи IsFaulted . Чаще всего лямбда-выражение используется для указания работы, которую выполняет задача.

Для операций, возвращающих значения, используется Task класс .

Создание экземпляра задачи

В следующем примере создается и выполняется четыре задачи. Три задачи выполняют Action делегат с именем action , который принимает аргумент типа Object. Четвертая задача выполняет лямбда-выражение ( Action делегат), которое определено в вызове метода создания задачи. Каждая задача создается и выполняется по-разному:

  • Экземпляр задачи t1 создается путем вызова конструктора класса Task, но запускается путем вызова метода Start() только после запуска задачи t2 .
  • Экземпляр задачи t2 создается и запускается в одном вызове метода путем TaskFactory.StartNew(Action, Object) вызова метода .
  • Экземпляр задачи t3 создается и запускается в одном вызове метода путем Run(Action) вызова метода .
  • Задача t4 выполняется синхронно в потоке main путем вызова RunSynchronously() метода .

Так как задача t4 выполняется синхронно, она выполняется в потоке приложения main. Остальные задачи обычно выполняются асинхронно в одном или нескольких потоках пула потоков.

using System; using System.Threading; using System.Threading.Tasks; class Example < static void Main() < Actionaction = (object obj) => < Console.WriteLine("Task=, obj=, Thread=", Task.CurrentId, obj, Thread.CurrentThread.ManagedThreadId); >; // Create a task but do not start it. Task t1 = new Task(action, "alpha"); // Construct a started task Task t2 = Task.Factory.StartNew(action, "beta"); // Block the main thread to demonstrate that t2 is executing t2.Wait(); // Launch t1 t1.Start(); Console.WriteLine("t1 has been launched. (Main Thread=)", Thread.CurrentThread.ManagedThreadId); // Wait for the task to finish. t1.Wait(); // Construct a started task using Task.Run. String taskData = "delta"; Task t3 = Task.Run( () =>  > // The example displays output like the following: // Task=1, obj=beta, Thread=3 // t1 has been launched. (Main Thread=1) // Task=2, obj=alpha, Thread=4 // Task=3, obj=delta, Thread=3 // Task=4, obj=gamma, Thread=1 
open System.Threading open System.Threading.Tasks let action = fun (obj: obj) -> printfn $"Task=, obj=, Thread=" // Create a task but do not start it. let t1 = new Task(action, "alpha") // Construct a started task let t2 = Task.Factory.StartNew(action, "beta") // Block the main thread to demonstrate that t2 is executing t2.Wait() // Launch t1 t1.Start() printfn $"t1 has been launched. (Main Thread=)" // Wait for the task to finish. t1.Wait() // Construct a started task using Task.Run. let taskData = "delta" let t3 = Task.Run(fun () -> printfn $"Task=, obj=, Thread=") // Wait for the task to finish. t3.Wait() // Construct an unstarted task let t4 = new Task(action, "gamma") // Run it synchronously t4.RunSynchronously() // Although the task was run synchronously, it is a good practice // to wait for it in the event exceptions were thrown by the task. t4.Wait() // The example displays output like the following: // Task=1, obj=beta, Thread=3 // t1 has been launched. (Main Thread=1) // Task=2, obj=alpha, Thread=4 // Task=3, obj=delta, Thread=3 // Task=4, obj=gamma, Thread=1 
Imports System.Threading Imports System.Threading.Tasks Module Example Public Sub Main() Dim action As Action(Of Object) = Sub(obj As Object) Console.WriteLine("Task=, obj=, Thread=", Task.CurrentId, obj, Thread.CurrentThread.ManagedThreadId) End Sub ' Construct an unstarted task Dim t1 As New Task(action, "alpha") ' Construct a started task Dim t2 As Task = Task.Factory.StartNew(action, "beta") ' Block the main thread to demonstrate that t2 is executing t2.Wait() ' Launch t1 t1.Start() Console.WriteLine("t1 has been launched. (Main Thread=)", Thread.CurrentThread.ManagedThreadId) ' Wait for the task to finish. t1.Wait() ' Construct a started task using Task.Run. Dim taskData As String = "delta" Dim t3 As Task = Task.Run(Sub() Console.WriteLine("Task=, obj=, Thread=", Task.CurrentId, taskData, Thread.CurrentThread.ManagedThreadId) End Sub) ' Wait for the task to finish. t3.Wait() ' Construct an unstarted task Dim t4 As New Task(action, "gamma") ' Run it synchronously t4.RunSynchronously() ' Although the task was run synchronously, it is a good practice ' to wait for it in the event exceptions were thrown by the task. t4.Wait() End Sub End Module ' The example displays output like the following: ' Task=1, obj=beta, Thread=3 ' t1 has been launched. (Main Thread=1) ' Task=2, obj=alpha, Thread=3 ' Task=3, obj=delta, Thread=3 ' Task=4, obj=gamma, Thread=1 

Создание и выполнение задачи

Экземпляры можно создавать Task различными способами. Наиболее распространенным подходом является вызов статического Run метода. Метод Run предоставляет простой способ запуска задачи, используя значения по умолчанию и не требуя дополнительных параметров. В следующем примере метод используется Run(Action) для запуска задачи, которая выполняет цикл, а затем отображает количество итераций цикла:

using System; using System.Threading.Tasks; public class Example < public static async Task Main() < await Task.Run( () => < // Just loop. int ctr = 0; for (ctr = 0; ctr Console.WriteLine("Finished loop iterations", ctr); > ); > > // The example displays the following output: // Finished 1000001 loop iterations 
open System.Threading.Tasks let main = task < do! Task.Run(fun () ->for i = 0 to 1000000 do printfn $"Finished loop iterations") > main.Wait() // The example displays the following output: // Finished 1000001 loop iterations 
Imports System.Threading.Tasks Module Example Public Sub Main() Dim t As Task = Task.Run(Sub() ' Just loop. Dim ctr As Integer = 0 For ctr = 0 to 1000000 Next Console.WriteLine("Finished loop iterations", ctr) End Sub) t.Wait() End Sub End Module ' The example displays the following output: ' Finished 1000001 loop iterations 

Альтернативой является статический TaskFactory.StartNew метод. Свойство Task.Factory возвращает TaskFactory объект . Перегрузки TaskFactory.StartNew метода позволяют указать параметры для передачи параметрам создания задачи и планировщику задач. В следующем примере используется TaskFactory.StartNew метод для запуска задачи. Он функционально эквивалентен коду в предыдущем примере.

using System; using System.Threading.Tasks; public class Example < public static void Main() < Task t = Task.Factory.StartNew( () => < // Just loop. int ctr = 0; for (ctr = 0; ctr Console.WriteLine("Finished loop iterations", ctr); > ); t.Wait(); > > // The example displays the following output: // Finished 1000001 loop iterations 
open System.Threading.Tasks let t = Task.Factory.StartNew(fun () -> // Just loop. for i = 0 to 1000000 do printfn $"Finished loop iterations") t.Wait() // The example displays the following output: // Finished 1000001 loop iterations 
Imports System.Threading.Tasks Module Example Public Sub Main() Dim t As Task = Task.Factory.StartNew(Sub() ' Just loop. Dim ctr As Integer = 0 For ctr = 0 to 1000000 Next Console.WriteLine("Finished loop iterations", ctr) End Sub) t.Wait() End Sub End Module ' The example displays the following output: ' Finished 1000001 loop iterations 

Разделение создания и выполнения задач

Класс Task также предоставляет конструкторы, которые инициализируют задачу, но не планируют ее выполнение. По соображениям Task.Run производительности метод или TaskFactory.StartNew является предпочтительным механизмом для создания и планирования вычислительных задач, но в сценариях, где создание и планирование должны быть разделены, можно использовать конструкторы, а затем вызвать Task.Start метод , чтобы запланировать выполнение задачи на более позднее время.

Ожидание завершения одной или нескольких задач

Поскольку задачи обычно выполняются асинхронно в потоке пула потоков, поток, который создает и запускает задачу, продолжает выполнение сразу после создания экземпляра задачи. В некоторых случаях, когда вызывающий поток является потоком main приложения, приложение может завершиться до фактического начала выполнения задачи. В других случаях логика приложения может потребовать, чтобы вызывающий поток продолжал выполнение только после завершения выполнения одной или нескольких задач. Вы можете синхронизировать выполнение вызывающего потока и асинхронных задач, которые он запускает, вызвав Wait метод для ожидания завершения одной или нескольких задач.

Чтобы дождаться завершения одной задачи, можно вызвать ее Task.Wait метод . Вызов Wait метода блокирует вызывающий поток, пока не завершится выполнение экземпляра одного класса.

В следующем примере метод без Wait() параметров вызывается для безусловного ожидания завершения задачи. Задача имитирует работу, вызывая Thread.Sleep метод для спящего режима в течение двух секунд.

using System; using System.Threading; using System.Threading.Tasks; class Program < static Random rand = new Random(); static void Main() < // Wait on a single task with no timeout specified. Task taskA = Task.Run( () =>Thread.Sleep(2000)); Console.WriteLine("taskA Status: ", taskA.Status); try < taskA.Wait(); Console.WriteLine("taskA Status: ", taskA.Status); > catch (AggregateException) < Console.WriteLine("Exception in taskA."); >> > // The example displays output like the following: // taskA Status: WaitingToRun // taskA Status: RanToCompletion 
open System open System.Threading open System.Threading.Tasks let rand = Random() // Wait on a single task with no timeout specified. let taskA = Task.Run(fun () -> Thread.Sleep 2000) printfn $"taskA Status: " try taskA.Wait() printfn $"taskA Status: " with :? AggregateException -> printfn "Exception in taskA." // The example displays output like the following: // taskA Status: WaitingToRun // taskA Status: RanToCompletion 
Imports System.Threading Imports System.Threading.Tasks Module Example Public Sub Main() ' Wait on a single task with no timeout specified. Dim taskA = Task.Run( Sub() Thread.Sleep(2000)) Console.WriteLine("taskA Status: ", taskA.Status) Try taskA.Wait() Console.WriteLine("taskA Status: ", taskA.Status) Catch e As AggregateException Console.WriteLine("Exception in taskA.") End Try End Sub End Module ' The example displays output like the following: ' taskA Status: WaitingToRun ' taskA Status: RanToCompletion 

Вы также можете условно дождаться завершения задачи. Методы Wait(Int32) и Wait(TimeSpan) блокируют вызывающий поток до завершения задачи или истечения интервала времени ожидания, в зависимости от того, что наступит раньше. Так как в следующем примере запускается задача, которая в течение двух секунд переходит в спящий режим, но определяет значение времени ожидания в одну секунду, вызывающий поток блокируется до истечения времени ожидания и до завершения выполнения задачи.

using System; using System.Threading; using System.Threading.Tasks; public class Example < public static void Main() < // Wait on a single task with a timeout specified. Task taskA = Task.Run( () =>Thread.Sleep(2000)); try < taskA.Wait(1000); // Wait for 1 second. bool completed = taskA.IsCompleted; Console.WriteLine("Task A completed: , Status: ", completed, taskA.Status); if (! completed) Console.WriteLine("Timed out before task A completed."); > catch (AggregateException) < Console.WriteLine("Exception in taskA."); >> > // The example displays output like the following: // Task A completed: False, Status: Running // Timed out before task A completed. 
open System open System.Threading open System.Threading.Tasks // Wait on a single task with a timeout specified. let taskA = Task.Run(fun () -> Thread.Sleep 2000) try taskA.Wait 1000 |> ignore // Wait for 1 second. let completed = taskA.IsCompleted printfn $"Task A completed: , Status: " if not completed then printfn "Timed out before task A completed." with :? AggregateException -> printfn "Exception in taskA." // The example displays output like the following: // Task A completed: False, Status: Running // Timed out before task A completed. 
Imports System.Threading Imports System.Threading.Tasks Module Example Public Sub Main() ' Wait on a single task with a timeout specified. Dim taskA As Task = Task.Run( Sub() Thread.Sleep(2000)) Try taskA.Wait(1000) ' Wait for 1 second. Dim completed As Boolean = taskA.IsCompleted Console.WriteLine("Task.Completed: , Status: ", completed, taskA.Status) If Not completed Then Console.WriteLine("Timed out before task A completed.") End If Catch e As AggregateException Console.WriteLine("Exception in taskA.") End Try End Sub End Module ' The example displays the following output: ' Task A completed: False, Status: Running ' Timed out before task A completed. 

Вы также можете предоставить маркер отмены, вызвав методы Wait(CancellationToken) и Wait(Int32, CancellationToken) . Если свойство маркера IsCancellationRequested имеет значение true или становится true во время Wait выполнения метода, метод создает исключение OperationCanceledException.

В некоторых случаях может потребоваться дождаться завершения первой из серии выполняемых задач, но не важно, какая это задача. Для этого можно вызвать одну из перегрузок Task.WaitAny метода . В следующем примере создаются три задачи, каждая из которых переходит в спящий режим в течение интервала, определяемого генератором случайных чисел. Метод WaitAny(Task[]) ожидает завершения первой задачи. Затем в примере отображаются сведения о состоянии всех трех задач.

using System; using System.Threading; using System.Threading.Tasks; public class Example < public static void Main() < var tasks = new Task[3]; var rnd = new Random(); for (int ctr = 0; ctr Thread.Sleep(rnd.Next(500, 3000))); try < int index = Task.WaitAny(tasks); Console.WriteLine("Task #completed first.\n", tasks[index].Id); Console.WriteLine("Status of all tasks:"); foreach (var t in tasks) Console.WriteLine(" Task #: ", t.Id, t.Status); > catch (AggregateException) < Console.WriteLine("An exception occurred."); >> > // The example displays output like the following: // Task #1 completed first. // // Status of all tasks: // Task #3: Running // Task #1: RanToCompletion // Task #4: Running 
open System open System.Threading open System.Threading.Tasks let rnd = new Random() let tasks = [| for _ = 0 to 2 do Task.Run(fun () -> rnd.Next(500, 3000) |> Thread.Sleep) |] try let index = Task.WaitAny tasks printfn $"Task # completed first.\n" printfn "Status of all tasks:" for t in tasks do printfn $" Task #: " with :? AggregateException -> printfn "An exception occurred." // The example displays output like the following: // Task #1 completed first. // // Status of all tasks: // Task #3: Running // Task #1: RanToCompletion // Task #4: Running 
Imports System.Threading Imports System.Threading.Tasks Module Example Public Sub Main() Dim tasks(2) As Task Dim rnd As New Random() For ctr As Integer = 0 To 2 tasks(ctr) = Task.Run( Sub() Thread.Sleep(rnd.Next(500, 3000))) Next Try Dim index As Integer= Task.WaitAny(tasks) Console.WriteLine("Task # completed first.", tasks(index).Id) Console.WriteLine() Console.WriteLine("Status of all tasks:") For Each t in tasks Console.WriteLine(" Task #: ", t.Id, t.Status) Next Catch e As AggregateException Console.WriteLine("An exception occurred.") End Try End Sub End Module ' The example displays output like the following: ' Task #1 completed first. ' ' Status of all tasks: ' Task #3: Running ' Task #1: RanToCompletion ' Task #4: Running 

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

using System; using System.Threading; using System.Threading.Tasks; public class Example < public static void Main() < // Wait for all tasks to complete. Task[] tasks = new Task[10]; for (int i = 0; i < 10; i++) < tasks[i] = Task.Run(() =>Thread.Sleep(2000)); > try < Task.WaitAll(tasks); >catch (AggregateException ae) < Console.WriteLine("One or more exceptions occurred: "); foreach (var ex in ae.Flatten().InnerExceptions) Console.WriteLine(" ", ex.Message); > Console.WriteLine("Status of completed tasks:"); foreach (var t in tasks) Console.WriteLine(" Task #: ", t.Id, t.Status); > > // The example displays the following output: // Status of completed tasks: // Task #2: RanToCompletion // Task #1: RanToCompletion // Task #3: RanToCompletion // Task #4: RanToCompletion // Task #6: RanToCompletion // Task #5: RanToCompletion // Task #7: RanToCompletion // Task #8: RanToCompletion // Task #9: RanToCompletion // Task #10: RanToCompletion 
open System open System.Threading open System.Threading.Tasks // Wait for all tasks to complete. let tasks = [| for _ = 0 to 9 do Task.Run(fun () -> Thread.Sleep 2000) |] try Task.WaitAll tasks with :? AggregateException as ae -> printfn "One or more exceptions occurred: " for ex in ae.Flatten().InnerExceptions do printfn $" " printfn "Status of completed tasks:" for t in tasks do printfn $" Task #: " // The example displays the following output: // Status of completed tasks: // Task #2: RanToCompletion // Task #1: RanToCompletion // Task #3: RanToCompletion // Task #4: RanToCompletion // Task #6: RanToCompletion // Task #5: RanToCompletion // Task #7: RanToCompletion // Task #8: RanToCompletion // Task #9: RanToCompletion // Task #10: RanToCompletion 
Imports System.Threading Imports System.Threading.Tasks Module Example Public Sub Main() ' Wait for all tasks to complete. Dim tasks(9) As Task For i As Integer = 0 To 9 tasks(i) = Task.Run( Sub() Thread.Sleep(2000) ) Next Try Task.WaitAll(tasks) Catch ae As AggregateException Console.WriteLine("One or more exceptions occurred: ") For Each ex In ae.Flatten().InnerExceptions Console.WriteLine(" ", ex.Message) Next End Try Console.WriteLine("Status of completed tasks:") For Each t in tasks Console.WriteLine(" Task #: ", t.Id, t.Status) Next End Sub End Module ' The example displays the following output: ' Status of completed tasks: ' Task #2: RanToCompletion ' Task #1: RanToCompletion ' Task #3: RanToCompletion ' Task #4: RanToCompletion ' Task #6: RanToCompletion ' Task #5: RanToCompletion ' Task #7: RanToCompletion ' Task #8: RanToCompletion ' Task #9: RanToCompletion ' Task #10: RanToCompletion 

Обратите внимание, что при ожидании завершения одной или нескольких задач все исключения, создаваемые в выполняющихся задачах, распространяются в потоке, который вызывает Wait метод , как показано в следующем примере. Он запускает 12 задач, три из которых выполняются нормально, а три — исключение. Из оставшихся шести задач три отменяется до их запуска, а три — во время выполнения. Исключения создаются в вызове WaitAll метода и обрабатываются блоком/ try catch .

using System; using System.Threading; using System.Threading.Tasks; public class Example < public static void Main() < // Create a cancellation token and cancel it. var source1 = new CancellationTokenSource(); var token1 = source1.Token; source1.Cancel(); // Create a cancellation token for later cancellation. var source2 = new CancellationTokenSource(); var token2 = source2.Token; // Create a series of tasks that will complete, be cancelled, // timeout, or throw an exception. Task[] tasks = new Task[12]; for (int i = 0; i < 12; i++) < switch (i % 4) < // Task should run to completion. case 0: tasks[i] = Task.Run(() =>Thread.Sleep(2000)); break; // Task should be set to canceled state. case 1: tasks[i] = Task.Run( () => Thread.Sleep(2000), token1); break; case 2: // Task should throw an exception. tasks[i] = Task.Run( () => < throw new NotSupportedException(); >); break; case 3: // Task should examine cancellation token. tasks[i] = Task.Run( () => < Thread.Sleep(2000); if (token2.IsCancellationRequested) token2.ThrowIfCancellationRequested(); Thread.Sleep(500); >, token2); break; > > Thread.Sleep(250); source2.Cancel(); try < Task.WaitAll(tasks); >catch (AggregateException ae) < Console.WriteLine("One or more exceptions occurred:"); foreach (var ex in ae.InnerExceptions) Console.WriteLine(" : ", ex.GetType().Name, ex.Message); > Console.WriteLine("\nStatus of tasks:"); foreach (var t in tasks) < Console.WriteLine(" Task #: ", t.Id, t.Status); if (t.Exception != null) < foreach (var ex in t.Exception.InnerExceptions) Console.WriteLine(" : ", ex.GetType().Name, ex.Message); > > > > // The example displays output like the following: // One or more exceptions occurred: // TaskCanceledException: A task was canceled. // NotSupportedException: Specified method is not supported. // TaskCanceledException: A task was canceled. // TaskCanceledException: A task was canceled. // NotSupportedException: Specified method is not supported. // TaskCanceledException: A task was canceled. // TaskCanceledException: A task was canceled. // NotSupportedException: Specified method is not supported. // TaskCanceledException: A task was canceled. // // Status of tasks: // Task #13: RanToCompletion // Task #1: Canceled // Task #3: Faulted // NotSupportedException: Specified method is not supported. // Task #8: Canceled // Task #14: RanToCompletion // Task #4: Canceled // Task #6: Faulted // NotSupportedException: Specified method is not supported. // Task #7: Canceled // Task #15: RanToCompletion // Task #9: Canceled // Task #11: Faulted // NotSupportedException: Specified method is not supported. // Task #12: Canceled 
open System open System.Threading open System.Threading.Tasks // Create a cancellation token and cancel it. let source1 = new CancellationTokenSource() let token1 = source1.Token source1.Cancel() // Create a cancellation token for later cancellation. let source2 = new CancellationTokenSource() let token2 = source2.Token // Create a series of tasks that will complete, be cancelled, // timeout, or throw an exception. let tasks = [| for i in 0..11 do match i % 4 with // Task should run to completion. | 0 -> Task.Run(fun () -> Thread.Sleep 2000) // Task should be set to canceled state. | 1 -> Task.Run(fun () -> Thread.Sleep 2000, token1) // Task should throw an exception. | 2 -> Task.Run(fun () -> NotSupportedException()) // Task should examine cancellation token. | _ -> Task.Run(fun () -> Thread.Sleep 2000 if token2.IsCancellationRequested then token2.ThrowIfCancellationRequested() Thread.Sleep 500, token2) |] Thread.Sleep 250 source2.Cancel() try Task.WaitAll tasks with :? AggregateException as ae -> printfn "One or more exceptions occurred:" for ex in ae.InnerExceptions do printfn $" : " printfn "\nStatus of tasks:" for t in tasks do printfn $" Task #: " if isNull t.Exception |> not then for ex in t.Exception.InnerExceptions do printfn $" : " // The example displays output like the following: // One or more exceptions occurred: // TaskCanceledException: A task was canceled. // NotSupportedException: Specified method is not supported. // TaskCanceledException: A task was canceled. // TaskCanceledException: A task was canceled. // NotSupportedException: Specified method is not supported. // TaskCanceledException: A task was canceled. // TaskCanceledException: A task was canceled. // NotSupportedException: Specified method is not supported. // TaskCanceledException: A task was canceled. // // Status of tasks: // Task #13: RanToCompletion // Task #1: Canceled // Task #3: Faulted // NotSupportedException: Specified method is not supported. // Task #8: Canceled // Task #14: RanToCompletion // Task #4: Canceled // Task #6: Faulted // NotSupportedException: Specified method is not supported. // Task #7: Canceled // Task #15: RanToCompletion // Task #9: Canceled // Task #11: Faulted // NotSupportedException: Specified method is not supported. // Task #12: Canceled 
Imports System.Threading Imports System.Threading.Tasks Module Example Public Sub Main() ' Create a cancellation token and cancel it. Dim source1 As New CancellationTokenSource() Dim token1 As CancellationToken = source1.Token source1.Cancel() ' Create a cancellation token for later cancellation. Dim source2 As New CancellationTokenSource() Dim token2 As CancellationToken = source2.Token ' Create a series of tasks that will complete, be cancelled, ' timeout, or throw an exception. Dim tasks(11) As Task For i As Integer = 0 To 11 Select Case i Mod 4 ' Task should run to completion. Case 0 tasks(i) = Task.Run( Sub() Thread.Sleep(2000)) ' Task should be set to canceled state. Case 1 tasks(i) = Task.Run( Sub() Thread.Sleep(2000), token1) Case 2 ' Task should throw an exception. tasks(i) = Task.Run( Sub() Throw New NotSupportedException() End Sub) Case 3 ' Task should examine cancellation token. tasks(i) = Task.Run( Sub() Thread.Sleep(2000) If token2.IsCancellationRequested token2.ThrowIfCancellationRequested() End If Thread.Sleep(500) End Sub, token2) End Select Next Thread.Sleep(250) source2.Cancel() Try Task.WaitAll(tasks) Catch ae As AggregateException Console.WriteLine("One or more exceptions occurred:") For Each ex in ae.InnerExceptions Console.WriteLine(" : ", ex.GetType().Name, ex.Message) Next End Try Console.WriteLine() Console.WriteLine("Status of tasks:") For Each t in tasks Console.WriteLine(" Task #: ", t.Id, t.Status) If t.Exception IsNot Nothing Then For Each ex in t.Exception.InnerExceptions Console.WriteLine(" : ", ex.GetType().Name, ex.Message) Next End If Next End Sub End Module ' The example displays output like the following: ' One or more exceptions occurred: ' TaskCanceledException: A task was canceled. ' NotSupportedException: Specified method is not supported. ' TaskCanceledException: A task was canceled. ' TaskCanceledException: A task was canceled. ' NotSupportedException: Specified method is not supported. ' TaskCanceledException: A task was canceled. ' TaskCanceledException: A task was canceled. ' NotSupportedException: Specified method is not supported. ' TaskCanceledException: A task was canceled. ' ' Status of tasks: ' Task #13: RanToCompletion ' Task #1: Canceled ' Task #3: Faulted ' NotSupportedException: Specified method is not supported. ' Task #8: Canceled ' Task #14: RanToCompletion ' Task #4: Canceled ' Task #6: Faulted ' NotSupportedException: Specified method is not supported. ' Task #7: Canceled ' Task #15: RanToCompletion ' Task #9: Canceled ' Task #11: Faulted ' NotSupportedException: Specified method is not supported. ' Task #12: Canceled 

Дополнительные сведения об обработке исключений в асинхронных операциях на основе задач см. в разделе Обработка исключений.

Задачи и региональные параметры

Начиная с классических приложений, предназначенных для платформа .NET Framework 4.6, язык и региональные параметры потока, который создает и вызывает задачу, становятся частью контекста потока. То есть независимо от текущего языка и региональных параметров потока, в котором выполняется задача, текущий язык и региональные параметры задачи являются языком и региональными параметрами вызывающего потока. Для приложений, предназначенных для версий платформа .NET Framework до платформа .NET Framework 4.6, язык и региональные параметры задачи — это язык и региональные параметры потока, в котором выполняется задача. Дополнительные сведения см. в разделе «Язык и региональные параметры и асинхронные операции на основе задач» этой статьи CultureInfo .

Приложения Магазина следуют среда выполнения Windows в настройке и получении языка и региональных параметров по умолчанию.

Для разработчиков отладчика

Для разработчиков, реализующих пользовательские отладчики, могут быть полезны несколько внутренних и закрытых членов задачи (они могут меняться от выпуска к выпуску). Поле m_taskId служит резервным хранилищем для Id свойства, однако доступ к этому полю непосредственно из отладчика может быть более эффективным, чем доступ к тому же значению с помощью метода получения свойства ( s_taskIdCounter счетчик используется для получения следующего доступного идентификатора для задачи). Аналогичным образом в m_stateFlags поле хранятся сведения о текущем этапе жизненного цикла задачи, которые также доступны через Status свойство . Поле m_action хранит ссылку на делегат задачи, а m_stateObject в поле — асинхронное состояние, переданное задаче разработчиком. Наконец, для отладчиков, которые анализят кадры стека, InternalWait метод служит потенциальным маркером, когда задача вводит операцию ожидания.

Конструкторы

Инициализирует новую задачу Task с заданным действием.

Инициализирует новую задачу Task с заданным действием и токеном CancellationToken.

Инициализирует новую задачу Task с заданными действием и параметрами создания.

Инициализирует новую задачу Task с заданными действием и параметрами создания.

Инициализирует новую задачу Task с заданным действием и состоянием.

Инициализирует новую задачу Task с заданными действием, состоянием и параметрами.

Инициализирует новую задачу Task с заданными действием, состоянием и параметрами.

Инициализирует новую задачу Task с заданными действием, состоянием и параметрами.

Свойства

Получает объект состояния, предоставленный при создании задачи Task, или значение null, если объект не предоставлен.

Возвращает задачу, которая уже завершилась успешно.

Возвращает объект TaskCreationOptions, используемый для создания данной задачи.

Возвращает идентификатор выполняющейся в настоящее время задачи Task.

Возвращает объект AggregateException, который привел к преждевременному завершению задачи Task. Если задача Task завершилась успешно или еще не создала ни одного исключения, возвращает значение null .

Предоставляет доступ к фабричным методам для создания и настройки экземпляров Task и Task .

Возвращает идентификатор указанного экземпляра Task.

Возвращает значение, указывающее, завершилось ли выполнение данного экземпляра Task из-за отмены.

Получает значение, указывающее, завершена ли задача.

Возвращает значение, указывающее, выполнена ли задача.

Возвращает значение, указывающее, завершилась ли задача Task из-за необработанного исключения.

Получает состояние TaskStatus данной задачи.

Методы

Настраивает объект типа awaiter, используемый для данного объекта Task.

Настраивает объект типа awaiter, используемый для данного объекта Task.

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

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

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

Создает продолжение, которое получает предоставленные вызывающей стороной сведения о состоянии и которое выполняется после завершения целевой задачи Task. Продолжение выполняется на основе набора указанных условий.

Создает продолжение, которое получает предоставленные вызывающей стороной сведения о состоянии и выполняется асинхронно после завершения целевой задачи Task. Продолжение использует указанный планировщик.

Создает продолжение, которое выполняется асинхронно после завершения выполнения целевой задачи Task.

Создает продолжение, которое получает маркер отмены и которое выполняется асинхронно после завершения целевой задачи Task.

Создает продолжение, которое выполняется после завершения целевой задачи в соответствии с заданными параметрами TaskContinuationOptions. Продолжение получает маркер отмены и использует указанный планировщик.

Создает продолжение, которое выполняется после завершения целевой задачи в соответствии с заданными параметрами TaskContinuationOptions.

Создает продолжение, которое выполняется асинхронно после завершения выполнения целевой задачи Task. Продолжение использует указанный планировщик.

Создает продолжение, которое получает предоставленные вызывающей стороной сведения о состоянии, выполняется асинхронно после завершения целевой задачи Task и возвращает значение.

Создает продолжение, которое выполняется асинхронно после завершения целевой задачи Task и возвращает значение. Продолжение получает предоставленные вызывающей стороной сведения и маркер отмены.

Создает продолжение, которое выполняется на основе указанных параметров продолжения задачи после завершения целевой задачи Task и которое возвращает значение. Продолжение получает предоставленные вызывающей стороной сведения и маркер отмены, а также использует указанный планировщик.

Создает продолжение, которое выполняется на основе указанных параметров продолжения задачи после завершения целевой задачи Task. Продолжение получает предоставленные вызывающей стороной сведения.

Создает продолжение, которое выполняется асинхронно после завершения выполнения целевой задачи Task. Продолжение получает предоставленные вызывающей стороной сведения и использует указанный планировщик.

Создает продолжение, которое выполняется асинхронно после завершения целевой задачи Task и возвращает значение.

Создает продолжение, которое выполняется асинхронно после завершения целевой задачи Task и возвращает значение. Продолжение получает маркер отмены.

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

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

Создает продолжение, которое выполняется асинхронно после завершения целевой задачи Task и возвращает значение. Продолжение использует указанный планировщик.

Создает задачу, которая завершается через заданное количество миллисекунд.

Создает отменяемую задачу, которая завершается через заданное количество миллисекунд.

Создает задачу, которая завершается через заданное время.

Создает отменяемую задачу, которая завершается через заданное время.

Создает задачу, которая завершается через заданное время.

Создает отменяемую задачу, которая завершается через заданное время.

Освобождает все ресурсы, используемые текущим экземпляром класса Task.

Удаляет задачуTask, освобождая все используемые ею неуправляемые ресурсы.

Определяет, равен ли указанный объект текущему объекту.

Создает задачу Task, которая завершилась из-за отмены с помощью указанного маркера отмены.

Создает задачу Task, которая завершилась с указанным исключением.

Получает объект типа awaiter, используемый для данного объекта Task.

Служит хэш-функцией по умолчанию.

Возвращает объект Type для текущего экземпляра.

Создает неполную копию текущего объекта Object.

Ставит в очередь заданную работу для запуска в пуле потоков и возвращает объект Task, представляющий эту работу.

Ставит в очередь заданную работу для запуска в пуле потоков и возвращает объект Task, представляющий эту работу. Токен отмены позволяет отменить задачу, если она не была начата.

Ставит в очередь указанную работу для запуска в пуле потоков и возвращает прокси для задачи, возвращаемой функцией function .

Ставит в очередь указанную работу для запуска в пуле потоков и возвращает прокси для задачи, возвращаемой функцией function . Токен отмены позволяет отменить задачу, если она не была начата.

Ставит в очередь заданную работу для запуска в пуле потоков и возвращает прокси для задачи Task(TResult) , возвращаемой function . Токен отмены позволяет отменить задачу, если она не была начата.

Ставит в очередь заданную работу для запуска в пуле потоков и возвращает прокси для задачи Task(TResult) , возвращаемой function .

Ставит в очередь заданную работу для запуска в пуле потоков и возвращает объект Task , представляющий эту работу. Токен отмены позволяет отменить задачу, если она не была начата.

Ставит в очередь заданную работу для запуска в пуле потоков и возвращает объект Task(TResult) , представляющий эту работу.

Синхронно выполняет задачу Task в текущем планировщике TaskScheduler.

Синхронно выполняет задачу Task в предоставленном планировщике TaskScheduler.

Запускает задачу Task, планируя ее выполнение в текущем планировщике TaskScheduler.

Запускает задачу Task, планируя ее выполнение в заданном планировщике TaskScheduler.

Возвращает строку, представляющую текущий объект.

Ожидает завершения выполнения задачи Task.

Ожидает завершения выполнения задачи Task. Ожидание завершается, если токен отмены отменяется до завершения задачи.

Ожидает завершения задачи Task в течение указанного числа миллисекунд.

Ожидает завершения выполнения задачи Task. Ожидание завершается, если время ожидания истекает или токен отмены отменяется до завершения задачи.

Ожидает завершения выполнения задач Task в течение указанного временного периода.

Ожидает завершения выполнения задачи Task.

Ожидает завершения выполнения всех указанных объектов Task.

Ожидает завершения выполнения всех указанных объектов Task, пока ожидание не будет отменено.

Ожидает завершения выполнения всех указанных объектов Task в течение указанного числа миллисекунд.

Ожидает завершения выполнения всех указанных объектов Task в течение указанного числа миллисекунд или до отмены ожидания.

Ожидает завершения выполнения всех указанных отменяемых объектов Task в течение указанного временного интервала.

Ожидает завершения выполнения любого из указанных объектов Task.

Ожидает завершения выполнения всех указанных объектов Task, пока ожидание не будет отменено.

Ожидает завершения выполнения любого из указанных объектов Task в течение указанного числа миллисекунд.

Ожидает завершения выполнения всех указанных объектов Task в течение указанного числа миллисекунд или до отмены токена отмены.

Ожидает завершения выполнения любого из указанных отменяемых объектов Task в течение указанного временного интервала.

Возвращает объект , Task который будет завершен после завершения или Task при запросе отмены указанного CancellationToken объекта.

Возвращает объект , Task который будет завершен по завершении или Task по истечении указанного времени ожидания.

Возвращает объект , Task который будет завершен по завершении, Task по истечении указанного времени ожидания или при запросе отмены указанного CancellationToken объекта.

Возвращает объект , Task который будет завершен по завершении или Task по истечении указанного времени ожидания.

Возвращает объект , Task который будет завершен по завершении, Task по истечении указанного времени ожидания или при запросе отмены указанного CancellationToken объекта.

Создает задачу, которая будет выполнена, когда все объекты Task в перечисляемой коллекции будут завершены.

Создает задачу, которая будет выполнена, когда все Task объекты в массиве будут завершены.

Создает задачу, которая будет выполнена, когда все объекты Task в перечисляемой коллекции будут завершены.

Создает задачу, которая будет выполнена, когда все Task объекты в массиве будут завершены.

Создает задачу, которая будет выполнена после выполнения любой из предоставленных задач.

Создает задачу, которая будет завершена после завершения любой из предоставленных задач.

Создает задачу, которая будет выполнена после выполнения любой из предоставленных задач.

Создает задачу, которая будет выполнена после выполнения любой из предоставленных задач.

Создает задачу, которая будет завершена после завершения любой из предоставленных задач.

Создает задачу, которая будет выполнена после выполнения любой из предоставленных задач.

Создает поддерживающий ожидание объект задачи, который асинхронным образом выдает возврат текущему контексту, когда его ожидают.

Явные реализации интерфейса

Возвращает дескриптор WaitHandle, который можно использовать для ожидания завершения задачи.

Получает значение, указывающее, синхронно ли выполнена операция.

Методы расширения

Ожидает завершения базовой операции DispatcherOperation в течение неограниченного времени.

Ожидает истечения заданного количества времени для базового DispatcherOperation.

Возвращает значение, указывающее, связан ли данный Task с DispatcherOperation.

Возвращает асинхронное действие среды выполнения Windows, представляющее запущенную задачу.

Применяется к

Потокобезопасность

Все члены Task, за исключением Dispose(), являются потокобезопасными и могут использоваться из нескольких потоков одновременно.

См. также раздел

  • Task
  • Библиотека параллельных задач (TPL)
  • Асинхронный шаблон на основе задач (TAP) в .NET: введение и обзор
  • Асинхронное программирование на основе задач
  • Примеры параллельного программирования с помощью .NET Core и .NET Standard

Обратная связь

Были ли сведения на этой странице полезными?

Обратная связь

Отправить и просмотреть отзыв по

Перевод «system task» на русский

With the abundance of all sorts of offers and limited financial resources arises complicated system task of selecting priority areas of support.

В условиях обилия всевозможных предложений и ограниченных финансовых возможностей возникает сложная системная задача выбора приоритетных направлений поддержки.

The system task is to identify the strengths of many traders and build an optimal trading strategy on their basis.

Системная задача — выявить сильные стороны многих трейдеров и построить на их основе оптимальную торговую стратегию.

Let’s start with the most basic operating system task: installing and running applications.
Возьмем, к примеру, самое базовое задание для операционной системы — установку и запуск приложений.

Management of marketing business processes is a complex system task, which requires the availability of resources.

Управление маркетинговыми бизнес-процессами является сложной системной задачей, для реализации которой необходимо наличие ресурсов.

The task component, referred to as a system task, is responsible for operating on the scene.
Компонент «задача», именуемый также «системной задачей», отвечает за действия в сцене.

A lot of people that are trying to acquire a computer system task at home job are first-timers so you are not the only one.

Немало людей, которые пытаются получить работу на компьютере из дома работают как новички, так что Вы не одиноки.

Power Users can perform any operating system task except tasks reserved for the Administrators group.

Опытные пользователи могут выполнять любые задачи с операционной системой, кроме задач, зарезервированных для группы «Администраторы».

For instance, we find merit in the proposal to establish a common data system task force aimed at developing better statistics and indicators in response to requests by different conferences, including the World Summit for Social Development.

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

The United Nations system task force on transnational organized crime and drug trafficking was established in March 2011, inter alia, to develop a coherent and multilateral approach to mitigating the impact of transnational threats on national dynamics.

В марте 2011 года была учреждена Целевая группа системы Организации Объединенных Наций по борьбе с транснациональной преступностью и незаконным оборотом наркотиков, в частности для выработки согласованного и многостороннего подхода к смягчению последствий транснациональных угроз для ситуации в странах.

Computer system task at home jobs requires extremely skilled individuals in standard considered that companies seldom need to shed their time in utilizing individuals that are unqualified the very same degree.

Труд на компьютере из дома требует высококвалифицированных специалистов в целом, так как компании редко хотят расходовать своё время при приёме на работу лиц, которые не находятся на должном уровне.

At the meeting held on 2 September, the secretariat made a presentation on the United Nations system task force on transnational organized crime and drug trafficking as threats to security and stability.

На совещании, состоявшемся 2 сентября, секретариат представил доклад о целевой группе системы Организации Объединенных Наций по проблемам транснациональной организованной преступности и оборота наркотиков как угрозам безопасности и стабильности.

Comment by the Administration. UNU has set up an information system task force to evaluate the Financial, Budgetary and Personnel Management System for enhancement and improvement, while keeping in mind the budgetary constraints in the biennium 2004-2005 as regards major improvements that require additional expenditure.

УООН создал целевую группу по информационным системам для оценки Системы управления финансами, бюджетом и персоналом на предмет ее усовершенствования и модернизации, принимая во внимание бюджетные ограничения в двухгодичном периоде 2004-2005 годов в отношении крупных усовершенствований, требующих дополнительных расходов.

Be open to new pointers, particularly on the subject that you are most mosting likely to be managing in your computer system task at house job.

Будьте открыты для новых идей, особенно в теме, которая вам наиболее интересна и Вы будете владеть своим делом с компьютером работая из дома.

In the Latvian pension system task of the Commission is to monitor the fund managers of the 2nd pension pillar and custodian banks subject to the law and other legislative requirements, i.e. that the funds are invested in accordance with the investment rules.

Задачей комиссии в рамках Латвийской пенсионной системы является надзор за тем, чтобы управляющие и банки-держатели средств 2-го пенсионного уровня соблюдали требования законов и других нормативных актов, т.е., чтобы вложение средств осуществлялось в соответствии с условиями вложений.

In the meantime each regional commission is continuing its on-going programme in close consultations with the UN system task forces established for the follow-up of IPCD.

В то же время каждая региональная комиссия продолжает реализовывать свою текущую программу в тесном взаимодействии с целевыми группами системы ООН, созданными для проведения мероприятий во исполнение решений МКНР.

Work is under way in the United Nations system task force on international public sector accounting standards on how to capture such income within international public sector accounting standards.

В настоящее время целевая группа системы Организации Объединенных Наций по международным стандартам учета в государственном секторе осуществляет работу по вопросу о том, каким образом учитывать такие поступления в рамках международных стандартов учета в государственном секторе.

The technical support team works under the umbrella of the United Nations system task team established by the Secretary-General to advance thinking on the global development agenda beyond 2015.

Группа технической поддержки работает под эгидой целевой группы системы Организации Объединенных Наций, учрежденной Генеральным секретарем с целью продумывания глобальной повестки дня развития на период после 2015 года.

This message may also appear if you terminated a «frozen» process using the browser’s task manager, the system task manager, or the command line interface.

Также сообщение может появляться, если вы завершили «зависший» процесс с помощью диспетчера задач «Амиго», системного диспетчера задач или через интерфейс командной строки.Попробуйте обновить страницу.

UN system task team on the post-2015 UN development agenda: disaster risk resilience

Системы ООН, Целевой группы по разработке повестки дня пост-2015 ООН: укрепление потенциала противодействия бедствиям на основе партнерства (МССБ ООН)

The United Nations system task force on transnational organized crime and drug trafficking continued to develop a system-wide response to transnational organized crime and drug trafficking, as well as a road map of key activities.

Целевая группа Организации Объединенных Наций по борьбе с транснациональной организованной преступностью и незаконным оборотом наркотиков продолжала заниматься разработкой общесистемных мер реагирования на проблемы транснациональной организованной преступности и незаконного оборота наркотиков, а также разработкой плана действий по основным направлениям деятельности.

Возможно неприемлемое содержание

Примеры предназначены только для помощи в переводе искомых слов и выражений в различных контекстах. Мы не выбираем и не утверждаем примеры, и они могут содержать неприемлемые слова или идеи. Пожалуйста, сообщайте нам о примерах, которые, на Ваш взгляд, необходимо исправить или удалить. Грубые или разговорные переводы обычно отмечены красным или оранжевым цветом.

Реализация программы с помощью System.Task

Пока реализовываю задачу с помощью System.Thread ,нужно сделать эту же задачу с помощью System.Task Предполагая, что в некотором каталоге на диске сохранено большое количество файлов с логами (журналами работы) прокси-сервера, написать программу вычисляющую статистику потребления трафика сети Интернет. На выходе программа должна создавать три текстовых документа: статистика по пользователям, статистика по доменам, статистика по датам. В качестве статистики использовать общий объем потребленного трафика, соответственно пользователем за все дни, при обращении к домену, в указанный день. При разработке программы считать, что каждый файл должен обрабатываться отдельно параллельно выполняющимся участком кода. После обработки всех файлов, полученные результаты для каждого из них должны суммироваться в общую сводку. Нужна помощь в составлении алгоритма,код я не прошу. Просто словесное описание как можно это сделать с помощью System.Task А код я потом напишу и если будут вопросы то скину сюда.

Отслеживать
25.1k 4 4 золотых знака 46 46 серебряных знаков 81 81 бронзовый знак
задан 9 янв 2016 в 13:16
380 5 5 серебряных знаков 22 22 бронзовых знака
пример работы с Task — тут после update.
9 янв 2016 в 13:27

Опишите, что вы уже знаете про Task и async / await . Рассказать вам про то, что это такое и как с ним работать с нуля — это тянет на хорошую, длинную статью, двумя словами тут не обойтись.

9 янв 2016 в 14:36

содержимое текстовых файлов такое же как тут? сколько таких файлов примерно. и сколько строк бывает в файле? если объемы небольшие. то решение — одно, а если логи гигабайтные и user’ов миллионы, то решение должно быть другое.

9 янв 2016 в 16:16

Да да такое же. у меня 10 текстовых в каждом максимум 10 строк. Мне тоже их надо парсить как с потоками или нет?

Verilog System Tasks

На нашем сайте уже было несколько ознакомительных статей по языку описания аппаратуры Verilog (статьи 1, 2, 3, 4, 5). Их даже можно выкачать одним файлом:

Введение в Verilog ( 473115 bytes )

Конечно, в тех ознакомительных статьях было невозможно рассказать все. Именно поэтому я продолжаю освещать некоторые возможности и особенности языка Verilog .

Сейчас речь пойдет о специальных ключевых словах языка Verilog , используемых для симуляции проектов. Симуляция очень важный этап разработки. Перед проверкой проекта в чипе FPGA или CPLD очень желательно промоделировать поведение всех его модулей.

Вообще-то и про симуляцию проекта в среде Quartus II, у меня тоже была статья. Однако, то была симуляция средствами среды Quartus II: нужно было «рисовать» входные сигналы для модуля и симулятор рассчитывал выходные сигналы и показывал все это в графическом виде. Теперь же разговор именно о средствах языка Verilog – это так называемые System Tasks . Я расскажу только о некоторых ключевых словах языка, важных для симуляции. Итак.

Ключевое слово $display .

$display используется для отображения в консоли симулятора значения переменных, строк или выражений. Используется вот так:

$display(p1,p2,p3,…,pn); Здесь параметры p1 , p2 , …, pn – это строки или выражения. Вообще, вызов этой системной функции похож по синтаксису на printf из языка C. Первый параметр, как правило – это строка форматирования, остальные параметры – это отображаемые выражения. Спецификаторы (не все!) строки форматирования вот такие:

%d или %D – отображение в десятичном виде,

%b или %B – отображение в двоичном виде,

%s или %S – отображение cтроки,

%h или %H – отображение в шестнадцатиричном виде,

%c или %C – отображение символа ASCII,

%o или %O – отображение в восьмеричном виде,

%t или %T – отображение в формате времени,

%e или %E – отображение реального числа в научном виде (например 3e10),

%f или %F – отображение реального числа в десятичном виде (например 3.14),

%g или %G – отображение реального числа либо в научном виде, либо в десятичном, как окажется короче.

$display всегда переходит на новую строку после печати. Поэтому вызов без параметров – это печать пустой строки. Вот несколько примеров использования:

$display(“Hello Verilog World!”);

— Hello Verilog World

//отображение текущего времени симуляции (предположим сейчас время «230»)

//отображение значения адреса и времени

$display(“at moment %d addr is %h”,$time,addr);

— at moment 200 addr is 1fe04400

Ключевое слово $monitor.

Язык Verilog предлагает механизм отслеживания момента изменения сигнала. Делается это с помощью $monitor . Формат параметров такой же, как и у $display :

Эта системная функция используется во время симуляции модулей. Она отслеживает момент изменения сигнала и тогда печатает на консоль информацию о сигналах, указанных в параметрах вызова. Список сигналов, за которыми идет наблюдение во время симуляции только один – тот что указан в параметрах к $monitor . Если $monitor был вызван несколько раз, то активен последний.

Отслеживание изменений сигнала с помощью $monitor может быть приостановленно командой $monitoroff , а вот возобновить отслеживание можно командой $monitoron .

Команда $ stop позволяет остановить симуляцию и перевести симулятор в интерактивный режим (чтобы вручную проверить значения каких нибудь сигналов в проекте).

Команда $finish полностью останавливает симулятор.

Когда проект становится сложным и большим для его симуляции вывода на консоль симулятора может оказаться недостаточно. Тогда используют вывод сообщений в файл.

Команда $fopen позволяет открыть файл и делать вывод сообщений отладки в файл с помощью команд $fdisplay , $fmonitor , $fwrite . Вот простой пример вывода сообщения симулятора в файл:

$fdisplay(handle1,”string out to file”);

Если вам кажется, что отладка с помощью вывода на консоль симулятора не достаточна, то вы можете использовать просмотр сигналов в графическом виде, в виде waveform . Для этого тоже есть свои средства.

Симулятор может генерировать так называемые VCD файлы – Value Change Dump File. Это текстовые файлы, которые описывают сигналы и моменты их изменения в проекте во время симуляции. Потом эти текстовые файлы можно прочитать другими специальными программами, которые отображают сигналы в графическоми виде.

Ключевое слово $dumpfile (“my_dump_file_name”) задает имя выходного файла для создания файла дампа. Слово $dumpvars (level, module_name) сообщает симулятору какие сигналы должны быть включены в вывод согласно уровню иерархии проекта и относительно некоторого модуля. Если $dumpvars вызывается без парамеров, то все сигналы будут выведены в файл. Ключевые слова $dumpon и $dumpoff позволяют включить запись или приостановить ее.

Возникает вопрос: как мы можем использовать все эти ключевые слова в среде Altera Quartus II? Нужно воспользоваться специальными внешними симуляторами. Один из них Mentor Graphics ® ModelSim. Компания Altera предлагает и бесплатную версию этого симулятора ModelSim-Altera Starter Edition. Эта среда довольно сложная в освоении, но совершенно необходимая для симуляции проектов.

Существуют и другие средства отладки и их довольно много, есть в том числе и открытые проекты. Один из них – icarus-verilog. Возможно его освоение даже окажется проще, чем ModelSim. Постараюсь рассказать о них в следующих статьях.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *