.NET提取 Thread 中返回值详情

目录
  • 一、.NET 2.0+
  • 二、.NET 4.0 +
  • 三、.NET 4.5 +

以下文章来源于公众号DotNetCore实战 

Igor Bendrup:

关于如何获取 Thread 中的返回值,不同的版本有不同的解决方案。

一、.NET 2.0+

你可以直接使用 Thread 对象,然后你可以使用闭包(声明变量并在 lambda 中捕获它),参考如下代码:

object result = null;
Thread thread = new System.Threading.Thread(() => { 
    //Some work...
    result = 42; });
thread.Start();
thread.Join();
Console.WriteLine(result);

也可以使用 IAsyncResult 然后在EndInvoke() 方法中获取返回值。

BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (s, e) => {
    //Some work...
    e.Result = 42;
};
worker.RunWorkerCompleted += (s, e) => {
    //e.Result "returned" from thread
    Console.WriteLine(e.Result);
};
worker.RunWorkerAsync();
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (s, e) => {
    //Some work...
    e.Result = 42;
};
worker.RunWorkerCompleted += (s, e) => {
    //e.Result "returned" from thread
    Console.WriteLine(e.Result);
};
worker.RunWorkerAsync();

还可以使用传统的 BackgroundWorker,然后在 RunWorkerCompleted  事件中捕获。

二、.NET 4.0 +

从 .NET 4.0 开始,你可以通过 Task 的方式开启 Thread,如果想获取返回值可以提取 Task 中的 Result

如下代码:

//Main thread will be blocked until task thread finishes
//(because of obtaining the value of the Result property)
int result = Task.Factory.StartNew(() => {
    //Some work...
    return 42;}).Result;

三、.NET 4.5 +

从 .NET 4.5 开始, 你可以使用 await,async 的方式替代 Task Result 属性,参考如下代码:

int result = await Task.Run(() => {
    //Some work...
    return 42; });

建议:用 Task 来替代传统 Thread 所做的事情。

到此这篇关于.NET提取 Thread 中返回值详情的文章就介绍到这了,更多相关.NET提取 Thread 中返回值内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .NET中STAThread的使用详解

    在WindowForm应用程序中主要的线程,是采用一种称为「Single-Threaded Apartment(STA)」的线程模型.这个STA线程模型,在线程内加入了讯息帮浦等等机制,减少开发人员撰写窗口程序的工作量. 而在开发类别库的时候,如果要使用类似的STA线程模型,可以使用下列的程序代码提供的类别来完成. 复制代码 代码如下: namespace CLK.Threading{    public class STAThread    {        // Enum        pr

  • .NET Windows 多线程thread编程

    进程:工厂搬砖头,10个工人搬完1000个砖头 线程:每个工人,搬完100个砖头,就是一个任务 采用线程,异步搬: 手工去搬,10个工人同时搬,效率高,异步执行,如果不采用线程,等第一个人搬完后第二个人才搬,那就慢了 什么时候不能用线程: 如果要用小车来搬,只有一个小车,那么,在这样的情况下,就不应该用线程,因为只有一个小车,各个线程都在争夺和等待这个小车,所以不能用线程.如果这个时候还要用线程,则导致资源浪费, 因为每个线程都有自己的资源,如包工头(CPU)同一时间要管理这10个工人,而只有一

  • .NET 6线程池ThreadPool实现概述

    目录 前言 任务的调度 基本调度单元 IThreadPoolWorkItem 实现类的实例. Task 全局队列 本地队列 偷窃机制 Worker Thread 的生命周期管理 线程注入实验 .NET 5 实验一 默认线程池配置 .NET 5 实验二 调整 ThreadPool 设置 .NET 5 实验三 tcs.Task.Wait() 改为 Thread.Sleep .NET 6 实验一 默认 ThreadPool 设置 .NET 6 实验二 调整 ThreadPool 设置 .NET 6 实

  • .Net基于Thread实现自旋锁的三种方式

    基于Thread.SpinWait实现自旋锁 实现原理:基于Test--And--Set原子操作实现 使用一个数据表示当前锁是否已经被获取 0表示未被索取,1表示已经获取 获取锁时会将_lock的值设置为1 然后检查修改前的值是否等于0, 优点: 不使用Thread.SpinWait方法,重试的方法体会为空,CPU会使用它的最大性能来不断的进行赋值和比较指令,会浪费很大的性能,Thread.SpinWait提示CPU当前正在自旋锁的循环中,可以休息若干个时间周期 使用自旋锁需要注意的问题,自旋锁

  • 一文带你了解.Net基于Threading.Mutex实现互斥锁

    本文主要讲解.Net基于Threading.Mutex实现互斥锁 基础互斥锁实现 基础概念:和自旋锁一样,操作系统提供的互斥锁内部有一个数值表示锁是否已经被获取,不同的是当获取锁失败的时候,它不会反复进行重试,而且让线程进入等待状态,并把线程对象添加到锁关联的队列中,另一个线程释放锁时会检查队列中是否有线程对象,如果有则通知操作系统唤醒该线程,因为获取锁的线程对象没有进行运行,即使锁长时间不释放也不会消耗CPU资源,但让线程进入等待状态和从等待状态唤醒的时间比自旋锁重试的纳秒级时间要长 wind

  • .NET提取 Thread 中返回值详情

    目录 一..NET 2.0+ 二..NET 4.0 + 三..NET 4.5 + 以下文章来源于公众号DotNetCore实战  Igor Bendrup: 关于如何获取 Thread 中的返回值,不同的版本有不同的解决方案. 一..NET 2.0+ 你可以直接使用 Thread 对象,然后你可以使用闭包(声明变量并在 lambda 中捕获它),参考如下代码: object result = null; Thread thread = new System.Threading.Thread(()

  • Java HtmlParse提取标签中的值操作

    ☆代码示例: 代码块语法遵循标准markdown代码,例如: package cas; import org.htmlparser.Node; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.filters.StringFilter; import org.htmlparser.filters.TagNameFilter; import org.htmlparser.tag

  • C语言函数调用约定和返回值详情

    目录 一.函数调用约定 1. 影响函数生成的符号名 2. 影响形参内存的释放者 _stdcall _fastcall _thiscall 二.函数的返回值 1. 0 < 返回值 <= 4字节 2. 4字节 < 返回值 <= 8字节 3. 返回值 > 8字节 一.函数调用约定 _cdecl:C调用约定 _stdcall:Windows标准的调用约定 _fastcall:快速调用约定 _thiscall:C++的成员函数调用约定 以上的函数调用约定入参都是从右向左,只有PASCA

  • 详解C++ 运算符重载中返回值的坑

    相信不少朋友在学习运算符重载的时候,都会被参数与返回值应该是左值引用,还是右值引用,还是const常量所困扰.当然我无法一一枚举,这次先讲一下返回值的坑 (没错就是我亲手写的bug) E0334 "Myclass" 没有适当的复制构造函数 其实这个问题的根源是,没有定义常量参数类型的拷贝构造函数所致 先来看看代码 //头文件head.h class Myclass { private: int a; public: Myclass(int b=0):a(b) {} //构造函数 Myc

  • C# 提取PDF中的表格详情

    目录 1.简单介绍 2.环境配置 3.代码示例 1.简单介绍 本文介绍在C#程序中(附VB.NET代码)提取PDF中的表格的方法,调用Spire.PDF for .NET提供的提取表格的 类 以及 方法 等来获取表格单元格中的文本内容:代码内容中涉及到的主要类及方法归纳如下表,供参考: 类型 描述 PdfDocument Class Represents a pdf document model. PdfDocument.LoadFromFile(string filename) Method

  • Java thread.isInterrupted() 返回值不确定结果分析解决

    目录 一.代码 二.分析结果 三.解决方案 一.代码 先上代码(以下这段代码会有多种执行结果) @Test public void test_interrupted_thread() throws Exception { InterruptThread interruptThread = new InterruptThread(); interruptThread.start(); interruptThread.interrupt(); System.out.println("interrup

  • R语言-实现list的嵌套与提取嵌套中的值

    R的数据结构有很多种,常用的包括向量vector,矩阵matrix,数组array,列表list和dataframe数据框. 前三个都有其特定的性质和结构 今天要介绍的是list,它非常灵活好用~因为可以存放不同数据类型 之前做assignment的时候还没有发现list的美妙,但现在写毕业论文数据量开始变大,同时通过调用Rpackage常常产生各种数据类型,渐渐发觉list真的很好用! 因为使用了for循环,还会产生层层嵌套的超大list,这时候,如何定义这个嵌套的list,如何取出里面的值就

  • Go语言-为什么返回值为接口类型,却返回结构体

    最近由于项目需求,阅读一些Go语言编写的项目的源代码,在某一个函数中发现了一个奇怪的现象:一个函数的返回值类型声明的是一个接口的类型,但是实际在函数体内返回的却是一个结构体类型的对象. 这个现象对于新手的我来说很是费解.在经过一些资料的查阅之后,自己得到了如下的解释: 一个结构体实现了一个接口,那么函数中返回值类型为接口时,就应该返回这个结构体. 下面举一个例子来说明: package main import ( "fmt" ) /** Shape接口定义两个函数: area() :计

  • Mybatis Select Count(*)的返回值类型介绍

    目录 Select Count(*)的返回值类型 返回Count(*)的整数值 Select Count(*)的返回值类型 <select id="queryAlarmStatisticalAnalysis4System" parameterType="AlarmMailSendLog" resultType="java.lang.Integer"> select count(*) from mon_alarm_mail_send_l

  • python从子线程中获得返回值的方法

    如下所示: # coding:utf-8 import time from threading import Thread def foo(number): time.sleep(20) return number class MyThread(Thread): def __init__(self, number): Thread.__init__(self) self.number = number def run(self): self.result = foo(self.number) d

随机推荐