本文档介绍并发运行时中轻量级任务的角色。 轻量级任务是直接从 concurrency::Scheduler 或 concurrency::ScheduleGroup 对象计划的任务。 轻量级任务类似于提供给 Windows API CreateThread 函数的功能。 因此,当改编现有代码以使用并发运行时的计划功能时,轻量级任务非常有用。 并发运行时本身使用轻量级任务来计划异步代理并在异步消息块之间发送消息。
并发运行时提供了一个默认计划程序,因此无需在应用程序中创建一个。 由于任务计划程序有助于优化应用程序的性能,如果你刚开始接触并发运行时,建议从使用并行模式库 (PPL) 或异步代理库开始。
轻量级任务开销低于异步代理和任务组。 例如,运行时不会在轻量级任务完成时通知你。 此外,运行时不会捕获或处理从轻量级任务引发的异常。 有关异常处理和轻量级任务的详细信息,请参阅异常处理。
对于大多数任务,我们建议使用更可靠的功能,例如任务组和并行算法,因为它们让你更轻松地将复杂任务分解为更多基本任务。
若要创建轻量级任务,请调用 concurrency::ScheduleGroup::ScheduleTask、concurrency::CurrentScheduler::ScheduleTask 或 concurrency::Scheduler::ScheduleTask 方法。 若要等待轻量级任务完成,请等待父计划程序关闭或使用同步机制,如 concurrency::event 对象。
示例
以下示例演示了 Windows API 创建和执行线程的典型用法。 此示例使用 CreateThread 函数在单独的线程上调用 MyThreadFunction。
// windows-threads.cpp
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
#define BUF_SIZE 255
DWORD WINAPI MyThreadFunction(LPVOID param);
// Data structure for threads to use.
typedef struct MyData {
int val1;
int val2;
} MYDATA, *PMYDATA;
int _tmain()
{
// Allocate memory for thread data.
PMYDATA pData = (PMYDATA) HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, sizeof(MYDATA));
if( pData == NULL )
{
ExitProcess(2);
}
// Set the values of the thread data.
pData->val1 = 50;
pData->val2 = 100;
// Create the thread to begin execution on its own.
DWORD dwThreadId;
HANDLE hThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThreadFunction, // thread function name
pData, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier
if (hThread == NULL)
{
ExitProcess(3);
}
// Wait for the thread to finish.
WaitForSingleObject(hThread, INFINITE);
// Close the thread handle and free memory allocation.
CloseHandle(hThread);
HeapFree(GetProcessHeap(), 0, pData);
return 0;
}
DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
PMYDATA pData = (PMYDATA)lpParam;
// Use thread-safe functions to print the parameter values.
TCHAR msgBuf[BUF_SIZE];
StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Parameters = %d, %d\n"),
pData->val1, pData->val2);
size_t cchStringSize;
StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
DWORD dwChars;
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), msgBuf, (DWORD)cchStringSize, &dwChars, NULL);
return 0;
}