启动时创建线程并传递数据

原文地址: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

启动时创建线程并传递数据的相关文章

配置监听器使项目启动时创建消费者

1.web.xml中注册监听器<listener><listener-class>com.activemq.common.InitComponent</listener-class></listener>2.InitComponent实现ServletContextListener,ApplicationContextAware接口,重写contextInitialized(ServletContextEvent servletContextEvent)方法

ThreadLocal遇到线程池时, 各线程间的数据会互相干扰, 串来串去

最近遇到一个比较隐蔽而又简单地问题,在使用ThreadLocal时发现出现多个线程中值串来串去,排查一番,确定问题为线程池的问题,线程池中的线程是会重复利用的,而ThreadLocal是用线程来做Key的所以在使用线程池的时候要特别注意ThreadLocal. ThreadLocal数据是在线程创建时绑定在线程上的, 所以解决方法是在使用数据之前调用remove() 移除掉之前的其他线程产生的数据 解决方法 重构remove方法 @Override public void remove() { 

跨域时,使用url传递数据,并取值。

很多时候,我们经常会遇到跨域的情况,比如A.html的数据想在B.html里运用. 那么,我们可以通过url传递数据的方式来实现: 比如我在A.html页面的数据:codeId=2  userName=lee  checkName=kay想通过url传递给B.html页面 那么,我们在B.html页面的url就可以这样B.html?codeId=2&userName=lee&checkName=kay 注意,这里需要用“&”去连接多个数据. 然后,我们就可以在B.html页面去取值

spring启动时加载字典表数据放入map

import java.util.HashMap; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import cn.zsmy.constant.Constant; import cn.zsmy.service.tmp.ExDictService; import cn.zsmy.

Web应用启动时,后台自动启动一个线程(转)

原文:http://blog.sina.com.cn/s/blog_6810dfc20101ipzq.html Web应用启动时,后台自动启动一个线程 (1)前言 前几天,manager问道一个问题:能不能实现类似于cron的后台管理方式.问题解决后,想对这几个问题进行一下简单的总结.以便抛砖引玉!首先简单的提及一下cron. Cron,计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思.在Linux中,我们经常用到 cron 服务器来完成这项工作.cron服务器可以根据配置文件约

Android学习之Intent传递数据

Intent在Activity中的作用主要是有两个: 1.启动目标Activity 2.传递数据 Intent在传递数据时分两种情况:向下一个Activity传递数据和从下一个Activity返回数据. 一.向下一个Activity传递数据主要是利用Intent作为“信使”来调用, 原Activity需要创建一个intent,并用putExtra(键,值)方法向intent中放入需要传递的信息,然后启动. public void onClick(View view){ String msg =

Tomcat启动时自动加载Servlet

1.想做一个服务启动时自动启动一不停止的获取订阅功能 2.之前是做一个Jsp页面请求servlet来触发方法 3.现在实现Tomcat启动时自动加载Servlet 1.Tomcat中启动Servlet时,只需要在Servlet所在的工程的配置文件web.xml中写成如下即可 <!-- 自动启动订阅接口 --> <servlet> <servlet-name>TimeServlet</servlet-name> <servlet-class>ser

Andriod:一个Activity向另一个Activity传递数据

假设现在有两个Activity:A与B,A要向B传递数据. 首先要创建两个Activity:Android:当前Activity跳转到另一个Activity A启动B: intent = new Intent(ActivityA.this,ActivityB.class); startActivity(intent); A启动B 并向B传递数据 多了一行 绑定数据 intent = new Intent(ActivityA.this,ActivityB.class); intent.putExt

android83 Activity的生命周期,启动模式,返回时传递数据

#Android四大组件 * Activity * BroadCastReceiver * Service * ContentProvider #Activity生命周期 * oncreate:Activity对象创建完毕,但此时不可见 * onstart:Activity在屏幕可见,但是此时没有焦点(不能够点,不能够交互) * onResume:Activity在屏幕可见,并且获得焦点 * onPause:Activity此时在屏幕依然可见,但是已经没有焦点 * onStop:Activity