一般情况下,不应该在执行多线程认证的时候对其子线程进行身份认证,如:A线程的子线程B和子线程C。

  当使用 Parallel.ForEach方法时,只有自身线程能够拥有相对应的权限,其子线程权限则为NULL,因此在某些特定的情况下将会抛出异常,如:

            Parallel.ForEach(sork, new ParallelOptions() { MaxDegreeOfParallelism =  }, data =>
{
if (!Thread.CurrentPrincipal.Identity.IsAuthenticated)
{
Console.WriteLine($"没有权限 {Thread.CurrentThread.ManagedThreadId}");
}
});

这种情况下,第一次运行时可以通过的。但第二次就会引发 未将实例引用到对象 的异常。这主要是因为Parallel本身不阻塞线程,其本线程和子线程一起执行任务。但子线程CurrentPrincipal是为赋值的。

同样的,Task也是如此。

            var task = new Task(() =>
{
if (!Thread.CurrentPrincipal.Identity.IsAuthenticated)
{
Console.WriteLine($"没有权限 {Thread.CurrentThread.ManagedThreadId}");
}
});

当然,不建议在复杂的方法里面对线程进行验证,对线程进行权限验证应该在使用多线程之前,当如果需要的话,还是很容易可以解决的。

            IIdentity identity = new GenericIdentity("root");
Thread.CurrentPrincipal = new GenericPrincipal(identity, new[] { "root" });
var principal = Thread.CurrentPrincipal;
Parallel.ForEach(sork, new ParallelOptions() { MaxDegreeOfParallelism = }, data =>
{
// 取父进程的授权给子线程即可
Thread.CurrentPrincipal = principal;
if (!Thread.CurrentPrincipal.Identity.IsAuthenticated)
{
Console.WriteLine($"没有权限 {Thread.CurrentThread.ManagedThreadId}");
}
});
var task = new Task(() =>
{
// 取父进程的授权给子线程即可
Thread.CurrentPrincipal = principal;
if (!Thread.CurrentPrincipal.Identity.IsAuthenticated)
{
Console.WriteLine($"没有权限 {Thread.CurrentThread.ManagedThreadId}");
}
});

Tasks遇到的一些坑,关于在子线程中对线程权限认证。的更多相关文章

  1. OkHttp3几个简单的例子和在子线程更新UI线程的方法

    okHttp用于android的http请求.据说很厉害,我们来一起尝尝鲜.但是使用okHttp也会有一些小坑,后面会讲到如何掉进坑里并爬出来. 首先需要了解一点,这里说的UI线程和主线程是一回事儿. ...

  2. EF5+MVC4系列(11)在主视图中用Html.RenderPartial调用分部视图(ViewDate传值);在主视图中按钮用ajax调用子action并在子action中使用return PartialView返回分布视图(return view ,return PartialView区别)

    一:主视图中使用Html.RenderPartial来调用子视图(注意,这里是直接调用子视图,而没有去调用子Action ) 在没有使用母版页的主视图中(也就是设置了layout为null的视图中), ...

  3. Vue的父子组件v-model双向绑定,父组件修改子组件中绑定的v-model属性

    先来看下实现的效果,父组件中有个文本框,在点击下面按钮时弹出抽屉,抽屉里也有个文本框,文本框里的初始值要和父组件的文本框同步,并且修改抽屉里的文本框值时 父组件里的文本框值也要跟着改变 网上有大概三种 ...

  4. winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体

    winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体,搜集了几个方法,列举如下: 一 . 所有权法 父窗体,名称为“fuForm”,在父窗体中有个公共刷新方法,也就是窗体数据初始 ...

  5. vue.js 1中父组件跳到子组件中并传参让子组件显示不同的内容

    父组件中的点击跳转: <ul class="insurance-entry clearfloat"> <li v-link="{name:'produc ...

  6. 【转载】Delphi7从子线程中发送消息到主线程触发事件执行

    在对数据库的操作时,有时要用一个子线程来进行后台的数据操作.比如说数据备份,转档什么的.在主窗口还能同是进行其它操作.而有时后台每处理一个数据文件,要向主窗口发送消息,让主窗口实时显示处理进度在窗口上 ...

  7. [react native] react-native-tab-navigator在子Component中隐藏

    因为文档只列出了TabBarIOS, 不支持Android,所以github上找到这个组件. 先说下我的页面构造:  入口文件 —> 注册组件(包含Navigator, 跳转到欢迎页)—> ...

  8. 在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()

    在子线程中new一个Handler为什么会报以下错误? java.lang.RuntimeException:  Can't create handler inside thread that has ...

  9. 如何在子线程中使用Toast和更新UI

    因为没一个Looper处理消息循环,所以子线程中无法使用Toast 方法: Looper.prepare(); Toast.makeText(getActivity(),"刷到底啦" ...

随机推荐

  1. python 的时间与日期

    显示当前日期: import time print time.strftime('%Y-%m-%d %A %X %Z',time.localtime(time.time())) 或者 你也可以用: p ...

  2. 4.n的高精度阶乘---优化

    题目:对于每组测试数据,在一行中给出一非负整数n(n小于等于100) 样例输入 3 5 10 样例输出 6 120 3628800 超时的代码如下:#include <iostream># ...

  3. 将html转换成image图片png格式

    import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics ...

  4. python不用声明数据类型

    不用声明变量一样,Python不用去声明函数的返回类型,是由于其“若类型”的语言特性决定的. 在其他语言中,例如C/C++语言中在存储一个数据之前,都需要在内存中给这个数据开辟一个固定的内存空间,并给 ...

  5. [Groovy] 学习Groovy的好网站(内容全面)

    https://www.tutorialspoint.com/groovy/index.htm

  6. javax.mail 发送邮件 , greenMail 测试 , spring

    发送邮件接口: package com.manxu.archetype.account.email; import javax.security.auth.login.AccountException ...

  7. powerdesigner 生成表备注

    第一步: 操作:Database-->Edit Current DBMS,进入下图页面, 然后分别将 Script-->Objects-->Table-->TableComme ...

  8. idea开发工具下报Set language level to 6-@Override in interfaces的解决方法

    idea开发工具下报Set language level to 6-@Override in interfaces的解决方法 实现接口时报如下错误:Set language level to 6-@O ...

  9. flask_数据库

    我们将使用 Flask-SQLAlchemy扩展来管理我们应用程序的数据.这个扩展封装了SQLAlchemy 项目,这是一个 对象关系映射器 或者 ORM.ORMs 允许数据库应用程序与对象一起工作, ...

  10. python面向对象-3类的静态方法和类方法

    还是以上次的洗衣机例子: class Washer: company='ZBL' def __init__(self,water=10,scour=2): self._water=water #不想让 ...