原文地址:https://msdn.microsoft.com/zh-cn/library/ts553s52(v=vs.110).aspx
在 .NET Framework 2.0 版中,ParameterizedThreadStart 委托提供了一种简便方法,可以在调用 Thread.Start 方法重载时将包含数据的对象传递给线程。 有关代码示例,请参见 ParameterizedThreadStart。
使用 ParameterizedThreadStart 委托不是传递数据的类型安全的方法,因为 Thread.Start 方法重载接受任何对象。 一种替代方法是将线程过程和数据封装在帮助器类中,并使用 ThreadStart 委托执行线程过程。 该技术在下面的两个代码示例中演示。
这两个委托都没有返回值,因为没有地方用于从异步调用中返回数据。 为检索线程方法的结果,您可以使用回调方法,如第二个代码示例中所示。
using System; using System.Threading; // The ThreadWithState class contains the information needed for // a task, and the method that executes the task. //帮助器类 public class ThreadWithState { // State information used in the task. private string boilerplate; private int value; // The constructor obtains the state information. public ThreadWithState(string text, int number) { boilerplate = text; value = number; } // The thread procedure performs the task, such as formatting // and printing a document. public void ThreadProc() { Console.WriteLine(boilerplate, value); } } // Entry point for the example. // public class Example { public static void Main() { // Supply the state information required by the task. ThreadWithState tws = new ThreadWithState( "This report displays the number {0}.", 42); // Create a thread to execute the task, and then // start the thread. Thread t = new Thread(new ThreadStart(tws.ThreadProc)); t.Start(); Console.WriteLine("Main thread does some work, then waits."); t.Join(); Console.WriteLine( "Independent task has completed; main thread ends."); } } // The example displays the following output: // Main thread does some work, then waits. // This report displays the number 42. // Independent task has completed; main thread ends.
使用回调方法检索数据
下面的示例演示了一个从线程中检索数据的回调方法。 包含数据和线程方法的类的构造函数也接受代表回调方法的委托;在线程方法结束前,它调用该回调委托。
using System; using System.Threading; // The ThreadWithState class contains the information needed for // a task, the method that executes the task, and a delegate // to call when the task is complete. // public class ThreadWithState { // State information used in the task. private string boilerplate; private int value; // Delegate used to execute the callback method when the // task is complete. private ExampleCallback callback; // The constructor obtains the state information and the // callback delegate. public ThreadWithState(string text, int number, ExampleCallback callbackDelegate) { boilerplate = text; value = number; callback = callbackDelegate; } // The thread procedure performs the task, such as // formatting and printing a document, and then invokes // the callback delegate with the number of lines printed. public void ThreadProc() { Console.WriteLine(boilerplate, value); if (callback != null) callback(1); } } // Delegate that defines the signature for the callback method. // public delegate void ExampleCallback(int lineCount); // Entry point for the example. // public class Example { public static void Main() { // Supply the state information required by the task. ThreadWithState tws = new ThreadWithState( "This report displays the number {0}.", 42, new ExampleCallback(ResultCallback) ); Thread t = new Thread(new ThreadStart(tws.ThreadProc)); t.Start(); Console.WriteLine("Main thread does some work, then waits."); t.Join(); Console.WriteLine( "Independent task has completed; main thread ends."); } // The callback method must match the signature of the // callback delegate. // public static void ResultCallback(int lineCount) { Console.WriteLine( "Independent task printed {0} lines.", lineCount); } } // The example displays the following output: // Main thread does some work, then waits. // This report displays the number 42. // Independent task printed 1 lines. // Independent task has completed; main thread ends.
时间: 2024-10-17 18:26:12