Bagikan melalui


ThreadPool.QueueUserWorkItem Metode

Definisi

Mengantrekan metode untuk eksekusi. Metode ini dijalankan ketika utas kumpulan utas tersedia.

Overload

QueueUserWorkItem(WaitCallback)

Mengantrekan metode untuk eksekusi. Metode ini dijalankan ketika utas kumpulan utas tersedia.

QueueUserWorkItem(WaitCallback, Object)

Mengantrekan metode untuk eksekusi, dan menentukan objek yang berisi data yang akan digunakan oleh metode . Metode ini dijalankan ketika utas kumpulan utas tersedia.

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)

Mengantrekan metode yang ditentukan oleh Action<T> delegasi untuk eksekusi, dan menyediakan data yang akan digunakan oleh metode . Metode ini dijalankan ketika utas kumpulan utas tersedia.

QueueUserWorkItem(WaitCallback)

Sumber:
ThreadPoolWorkQueue.cs
Sumber:
ThreadPoolWorkQueue.cs
Sumber:
ThreadPoolWorkQueue.cs

Mengantrekan metode untuk eksekusi. Metode ini dijalankan ketika utas kumpulan utas tersedia.

public:
 static bool QueueUserWorkItem(System::Threading::WaitCallback ^ callBack);
public static bool QueueUserWorkItem (System.Threading.WaitCallback callBack);
static member QueueUserWorkItem : System.Threading.WaitCallback -> bool
Public Shared Function QueueUserWorkItem (callBack As WaitCallback) As Boolean

Parameter

callBack
WaitCallback

WaitCallback yang mewakili metode yang akan dijalankan.

Mengembalikan

true jika metode berhasil diantrekan; NotSupportedException dilemparkan jika item kerja tidak dapat diantrekan.

Pengecualian

callBackadalah null.

Runtime bahasa umum (CLR) dihosting, dan host tidak mendukung tindakan ini.

Contoh

Contoh berikut menggunakan QueueUserWorkItem(WaitCallback) metode kelebihan beban untuk mengantre tugas, yang diwakili oleh ThreadProc metode , untuk mengeksekusi ketika utas tersedia. Tidak ada informasi tugas yang diberikan dengan kelebihan beban ini. Oleh karena itu, informasi yang tersedia untuk ThreadProc metode terbatas pada objek milik metode .

using namespace System;
using namespace System::Threading;

ref class Example
{
public:

   // This thread procedure performs the task.
   static void ThreadProc(Object^ stateInfo)
   {
      
      // No state object was passed to QueueUserWorkItem, so stateInfo is 0.
      Console::WriteLine( "Hello from the thread pool." );
   }
};

int main()
{
   // Queue the task.
   ThreadPool::QueueUserWorkItem(gcnew WaitCallback(Example::ThreadProc));

   Console::WriteLine("Main thread does some work, then sleeps.");
   
   Thread::Sleep(1000);
   Console::WriteLine("Main thread exits.");
   return 0;
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.
using System;
using System.Threading;

public class Example 
{
    public static void Main() 
    {
        // Queue the task.
        ThreadPool.QueueUserWorkItem(ThreadProc);
        Console.WriteLine("Main thread does some work, then sleeps.");
        Thread.Sleep(1000);

        Console.WriteLine("Main thread exits.");
    }

    // This thread procedure performs the task.
    static void ThreadProc(Object stateInfo) 
    {
        // No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.");
    }
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.
Imports System.Threading

Public Module Example
    Public Sub Main()
        ' Queue the work for execution.
        ThreadPool.QueueUserWorkItem(AddressOf ThreadProc)
        
        Console.WriteLine("Main thread does some work, then sleeps.")

        Thread.Sleep(1000)

        Console.WriteLine("Main thread exits.")
    End Sub

    ' This thread procedure performs the task.
    Sub ThreadProc(stateInfo As Object)
        ' No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.")
    End Sub
End Module
' The example displays output like the following:
'       Main thread does some work, then sleeps.
'       Hello from the thread pool.
'       Main thread exits.

Keterangan

Anda dapat menempatkan data yang diperlukan oleh metode antrean di bidang instans kelas tempat metode ditentukan, atau Anda dapat menggunakan QueueUserWorkItem(WaitCallback, Object) kelebihan beban yang menerima objek yang berisi data yang diperlukan.

Catatan

Pengguna Visual Basic dapat menghilangkan WaitCallback konstruktor, dan cukup menggunakan AddressOf operator saat meneruskan metode panggilan balik ke QueueUserWorkItem. Visual Basic secara otomatis memanggil konstruktor delegasi yang benar.

Nilai Thread.CurrentPrincipal properti disebarkan ke utas pekerja yang diantrekan menggunakan QueueUserWorkItem metode .

Lihat juga

Berlaku untuk

QueueUserWorkItem(WaitCallback, Object)

Sumber:
ThreadPoolWorkQueue.cs
Sumber:
ThreadPoolWorkQueue.cs
Sumber:
ThreadPoolWorkQueue.cs

Mengantrekan metode untuk eksekusi, dan menentukan objek yang berisi data yang akan digunakan oleh metode . Metode ini dijalankan ketika utas kumpulan utas tersedia.

public:
 static bool QueueUserWorkItem(System::Threading::WaitCallback ^ callBack, System::Object ^ state);
public static bool QueueUserWorkItem (System.Threading.WaitCallback callBack, object? state);
public static bool QueueUserWorkItem (System.Threading.WaitCallback callBack, object state);
static member QueueUserWorkItem : System.Threading.WaitCallback * obj -> bool
Public Shared Function QueueUserWorkItem (callBack As WaitCallback, state As Object) As Boolean

Parameter

callBack
WaitCallback

yang WaitCallback mewakili metode untuk dieksekusi.

state
Object

Objek yang berisi data yang akan digunakan oleh metode .

Mengembalikan

true jika metode berhasil diantrekan; NotSupportedException dilemparkan jika item kerja tidak dapat diantrekan.

Pengecualian

Runtime bahasa umum (CLR) dihosting, dan host tidak mendukung tindakan ini.

callBackadalah null.

Contoh

Contoh berikut menggunakan kumpulan utas .NET untuk menghitung hasil Fibonacci untuk lima angka antara 20 dan 40. Setiap Fibonacci hasil diwakili oleh Fibonacci kelas , yang menyediakan metode bernama ThreadPoolCallback yang melakukan perhitungan. Objek yang mewakili setiap Fibonacci nilai dibuat, dan ThreadPoolCallback metode diteruskan ke QueueUserWorkItem, yang menetapkan utas yang tersedia di kumpulan untuk menjalankan metode .

Karena setiap Fibonacci objek diberi nilai semi acak untuk dihitung, dan karena setiap utas akan bersaing untuk waktu prosesor, Anda tidak dapat mengetahui terlebih dahulu berapa lama waktu yang dibutuhkan untuk menghitung kelima hasil. Itulah sebabnya setiap Fibonacci objek dilewatkan instans ManualResetEvent kelas selama konstruksi. Setiap objek memberi sinyal objek peristiwa yang disediakan ketika perhitungannya selesai, yang memungkinkan utas utama untuk memblokir eksekusi hingga WaitAll kelima Fibonacci objek telah menghitung hasil. Metode Main kemudian menampilkan setiap Fibonacci hasil.

using namespace System;
using namespace System::Threading;

public ref class Fibonacci
{
private:
    ManualResetEvent^ _doneEvent;

    int Calculate(int n)
    {
        if (n <= 1)
        {
            return n;
        }
        return Calculate(n - 1) + Calculate(n - 2);
    }

public:
    
    int ID;
    int N;
    int FibOfN;

    Fibonacci(int id, int n, ManualResetEvent^ doneEvent)
    {
        ID = id;
        N = n;
        _doneEvent = doneEvent;
    }

    void Calculate()
    {
        FibOfN = Calculate(N);
    }

    void SetDone()
    {
        _doneEvent->Set();
    }
};

public ref struct Example
{
public:

    static void ThreadProc(Object^ stateInfo)
    {
        Fibonacci^ f = dynamic_cast<Fibonacci^>(stateInfo);
        Console::WriteLine("Thread {0} started...", f->ID);
        f->Calculate();
        Console::WriteLine("Thread {0} result calculated...", f->ID);
        f->SetDone();
    }
};


void main()
{
    const int FibonacciCalculations = 5;

    array<ManualResetEvent^>^ doneEvents = gcnew array<ManualResetEvent^>(FibonacciCalculations);
    array<Fibonacci^>^ fibArray = gcnew array<Fibonacci^>(FibonacciCalculations);
    Random^ rand = gcnew Random();

    Console::WriteLine("Launching {0} tasks...", FibonacciCalculations);

    for (int i = 0; i < FibonacciCalculations; i++)
    {
        doneEvents[i] = gcnew ManualResetEvent(false);
        Fibonacci^ f = gcnew Fibonacci(i, rand->Next(20, 40), doneEvents[i]);
        fibArray[i] = f;
        ThreadPool::QueueUserWorkItem(gcnew WaitCallback(Example::ThreadProc), f);
    }

    WaitHandle::WaitAll(doneEvents);
    Console::WriteLine("All calculations are complete.");

    for (int i = 0; i < FibonacciCalculations; i++)
    {
        Fibonacci^ f = fibArray[i];
        Console::WriteLine("Fibonacci({0}) = {1}", f->N, f->FibOfN);
    }
}
// Output is similar to:
// Launching 5 tasks...
// Thread 3 started...
// Thread 2 started...
// Thread 1 started...
// Thread 0 started...
// Thread 4 started...
// Thread 4 result calculated...
// Thread 1 result calculated...
// Thread 2 result calculated...
// Thread 0 result calculated...
// Thread 3 result calculated...
// All calculations are complete.
// Fibonacci(30) = 832040
// Fibonacci(24) = 46368
// Fibonacci(26) = 121393
// Fibonacci(36) = 14930352
// Fibonacci(20) = 6765
using System;
using System.Threading;

public class Fibonacci
{
    private ManualResetEvent _doneEvent;

    public Fibonacci(int n, ManualResetEvent doneEvent)
    {
        N = n;
        _doneEvent = doneEvent;
    }

    public int N { get; }

    public int FibOfN { get; private set; }

    public void ThreadPoolCallback(Object threadContext)
    {
        int threadIndex = (int)threadContext;
        Console.WriteLine($"Thread {threadIndex} started...");
        FibOfN = Calculate(N);
        Console.WriteLine($"Thread {threadIndex} result calculated...");
        _doneEvent.Set();
    }

    public int Calculate(int n)
    {
        if (n <= 1)
        {
            return n;
        }
        return Calculate(n - 1) + Calculate(n - 2);
    }
}

public class ThreadPoolExample
{
    static void Main()
    {
        const int FibonacciCalculations = 5;

        var doneEvents = new ManualResetEvent[FibonacciCalculations];
        var fibArray = new Fibonacci[FibonacciCalculations];
        var rand = new Random();

        Console.WriteLine($"Launching {FibonacciCalculations} tasks...");
        for (int i = 0; i < FibonacciCalculations; i++)
        {
            doneEvents[i] = new ManualResetEvent(false);
            var f = new Fibonacci(rand.Next(20, 40), doneEvents[i]);
            fibArray[i] = f;
            ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i);
        }

        WaitHandle.WaitAll(doneEvents);
        Console.WriteLine("All calculations are complete.");

        for (int i = 0; i < FibonacciCalculations; i++)
        {
            Fibonacci f = fibArray[i];
            Console.WriteLine($"Fibonacci({f.N}) = {f.FibOfN}");
        }
    }
}
// The output is similar to:
// Launching 5 tasks...
// Thread 3 started...
// Thread 4 started...
// Thread 2 started...
// Thread 1 started...
// Thread 0 started...
// Thread 2 result calculated...
// Thread 3 result calculated...
// Thread 4 result calculated...
// Thread 1 result calculated...
// Thread 0 result calculated...
// All calculations are complete.
// Fibonacci(35) = 9227465
// Fibonacci(27) = 196418
// Fibonacci(25) = 75025
// Fibonacci(25) = 75025
// Fibonacci(27) = 196418
Imports System.Threading

Public Class Fibonacci
    Private _doneEvent As ManualResetEvent

    Public Sub New(n As Integer, doneEvent As ManualResetEvent)
        Me.N = n
        _doneEvent = doneEvent
    End Sub

    Public ReadOnly Property N As Integer
    Public Property FibOfN As Integer

    Public Sub ThreadPoolCallback(threadContext As Object)
        Dim threadIndex As Integer = CType(threadContext, Integer)
        Console.WriteLine($"Thread {threadIndex} started...")
        FibOfN = Calculate(N)
        Console.WriteLine($"Thread {threadIndex} result calculated...")
        _doneEvent.Set()
    End Sub

    Public Function Calculate(n As Integer) As Integer
        If (n <= 1) Then
            Return n
        End If
        Return Calculate(n - 1) + Calculate(n - 2)
    End Function
End Class

Public Class ThreadPoolExample

    <MTAThread>
    Public Shared Sub Main()

        Const FibonacciCalculations As Integer = 5

        Dim doneEvents(FibonacciCalculations - 1) As ManualResetEvent
        Dim fibArray(FibonacciCalculations - 1) As Fibonacci
        Dim rand As Random = New Random()

        Console.WriteLine($"Launching {FibonacciCalculations} tasks...")

        For i As Integer = 0 To FibonacciCalculations - 1
            doneEvents(i) = New ManualResetEvent(False)
            Dim f As Fibonacci = New Fibonacci(rand.Next(20, 40), doneEvents(i))
            fibArray(i) = f
            ThreadPool.QueueUserWorkItem(AddressOf f.ThreadPoolCallback, i)
        Next

        WaitHandle.WaitAll(doneEvents)
        Console.WriteLine("All calculations are complete.")

        For i As Integer = 0 To FibonacciCalculations - 1
            Dim f As Fibonacci = fibArray(i)
            Console.WriteLine($"Fibonacci({f.N}) = {f.FibOfN}")
        Next
    End Sub
End Class
' Output is similar to
' Launching 5 tasks...
' Thread 1 started...
' Thread 2 started...
' Thread 3 started...
' Thread 4 started...
' Thread 0 started...
' Thread 4 result calculated...
' Thread 2 result calculated...
' Thread 3 result calculated...
' Thread 0 result calculated...
' Thread 1 result calculated...
' All calculations are complete.
' Fibonacci(37) = 24157817
' Fibonacci(38) = 39088169
' Fibonacci(29) = 514229
' Fibonacci(32) = 2178309
' Fibonacci(23) = 28657

Keterangan

Jika metode panggilan balik memerlukan data yang kompleks, Anda dapat menentukan kelas untuk berisi data.

Catatan

Pengguna Visual Basic dapat menghilangkan WaitCallback konstruktor, dan cukup menggunakan AddressOf operator saat meneruskan metode panggilan balik ke QueueUserWorkItem. Visual Basic secara otomatis memanggil konstruktor delegasi yang benar.

Lihat juga

Berlaku untuk

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)

Sumber:
ThreadPoolWorkQueue.cs
Sumber:
ThreadPoolWorkQueue.cs
Sumber:
ThreadPoolWorkQueue.cs

Mengantrekan metode yang ditentukan oleh Action<T> delegasi untuk eksekusi, dan menyediakan data yang akan digunakan oleh metode . Metode ini dijalankan ketika utas kumpulan utas tersedia.

public:
generic <typename TState>
 static bool QueueUserWorkItem(Action<TState> ^ callBack, TState state, bool preferLocal);
public static bool QueueUserWorkItem<TState> (Action<TState> callBack, TState state, bool preferLocal);
static member QueueUserWorkItem : Action<'State> * 'State * bool -> bool
Public Shared Function QueueUserWorkItem(Of TState) (callBack As Action(Of TState), state As TState, preferLocal As Boolean) As Boolean

Jenis parameter

TState

Jenis elemen .state

Parameter

callBack
Action<TState>

yang Action<T> mewakili metode untuk dieksekusi.

state
TState

Objek yang berisi data yang akan digunakan oleh metode .

preferLocal
Boolean

true untuk lebih memilih antrean item kerja dalam antrean yang dekat dengan utas saat ini; false untuk lebih suka mengantrekan item kerja ke antrean bersama kumpulan utas.

Mengembalikan

true jika metode berhasil diantrekan; NotSupportedException dilemparkan jika item kerja tidak dapat diantrekan.

Berlaku untuk