多线程编程允许同时执行多个任务。当多个线程与主UI线程同时运行时,需要同步它们的执行。一种方法是在继续执行之前等待线程完成。
考虑以下代码片段:
<code class="language-csharp">public void StartTheActions() { Thread t1 = new Thread(new ThreadStart(action1)); t1.Start(); // 在启动t2之前等待t1完成。 // 创建一个用作通知机制的事件。 }</code>
要等待另一个线程完成,您可以采用以下几种方法:
<code class="language-csharp">t1.Join();</code>
此方法会阻塞当前线程,直到指定的线程完成其执行。
<code class="language-csharp">ManualResetEvent waitEvent = new ManualResetEvent(false); // 启动线程并传递等待事件。 Thread t1 = new Thread(() => { action1(); waitEvent.Set(); }); t1.Start(); // 等待线程完成。 waitEvent.WaitOne();</code>
<code class="language-csharp">public event EventHandler ThreadDone; // 启动线程并添加事件处理程序。 Thread t1 = new Thread(() => { action1(); ThreadDone?.Invoke(this, EventArgs.Empty); }); t1.Start(); // 通过注册事件处理程序来等待线程。 void WaitForThread() { ThreadDone += (sender, args) => { /* 执行操作 */ }; }</code>
<code class="language-csharp">public delegate void ThreadDoneHandler(); // 启动线程并传递用于通知的委托。 Thread t1 = new Thread(() => { action1(); threadDone?.Invoke(); }); t1.Start(); // 通过注册委托来等待线程。 ThreadDoneHandler threadDoneHandler = () => { /* 执行操作 */ }; threadDoneHandler += delegate { threadDoneHandler = null; };</code>
<code class="language-csharp">Task<int> task = Task.Run(() => { return action1(); }); // 等待任务完成。 int result = task.Result;</code>
选择哪种方法取决于应用程序的具体需求。如果您需要阻塞当前线程直到另一个线程完成,Thread.Join()
可能是最合适的选项。如果您不想阻塞线程,可以使用其他技术,例如事件、委托或异步操作。
以上是在 .NET 中如何等待线程完成?的详细内容。更多信息请关注PHP中文网其他相关文章!