GVKun编程网logo

c# – Task.Yield是否真的在当前上下文中运行了continuation?(c#当前上下文中不存在)

16

想了解c#–Task.Yield是否真的在当前上下文中运行了continuation?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于c#当前上下文中不存在的相关问题,此外,我们还将为您介绍

想了解c# – Task.Yield是否真的在当前上下文中运行了continuation?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于c#当前上下文中不存在的相关问题,此外,我们还将为您介绍关于Abp'FeatureManagementPermissions'在当前上下文中不存在、AnnotationConfigApplicationContext和父上下文、ASP.net MVC C# 当前上下文中不存在名称 "viewbag"、asp.net-core – 当前上下文中不存在名称“SqlServerValueGenerationStrategy”的新知识。

本文目录一览:

c# – Task.Yield是否真的在当前上下文中运行了continuation?(c#当前上下文中不存在)

c# – Task.Yield是否真的在当前上下文中运行了continuation?(c#当前上下文中不存在)

尽管已经编写了多年的C#,但我不是async的专家,但是在阅读了一些MSDN博客文章之后,AFAICT:

> Awaitables(例如Task)可以捕获或不捕获当前的SynchronizationContext.
> SynchronizationContext大致对应一个线程:如果我在UI线程上并调用await任务,即“流上下文”,则继续在UI线程上运行.如果我调用await task.ConfigureAwait(false),则继续在某个随机线程池线程上运行,该线程可能是/可能不是UI线程.
>对于awaiters:OnCompleted流上下文,而UnsafeOnCompleted不流动上下文.

好了,有了这个,我们来看看Roslyn为等待Task.Yield()生成的代码.这个:

using System;
using System.Threading.Tasks;

public class C {
    public async void M() {
        await Task.Yield();
    }
}

这个编译器生成的代码的结果(你可以自己验证here):

public class C
{
    [CompilerGenerated]
    [StructLayout(LayoutKind.Auto)]
    private struct <M>d__0 : IAsyncStateMachine
    {
        public int <>1__state;

        public AsyncVoidMethodBuilder <>t__builder;

        private YieldAwaitable.YieldAwaiter <>u__1;

        void IAsyncStateMachine.MoveNext()
        {
            int num = this.<>1__state;
            try
            {
                YieldAwaitable.YieldAwaiter yieldAwaiter;
                if (num != 0)
                {
                    yieldAwaiter = Task.Yield().GetAwaiter();
                    if (!yieldAwaiter.IsCompleted)
                    {
                        num = (this.<>1__state = 0);
                        this.<>u__1 = yieldAwaiter;
                        this.<>t__builder.AwaitUnsafeOnCompleted<YieldAwaitable.YieldAwaiter,C.<M>d__0>(ref yieldAwaiter,ref this);
                        return;
                    }
                }
                else
                {
                    yieldAwaiter = this.<>u__1;
                    this.<>u__1 = default(YieldAwaitable.YieldAwaiter);
                    num = (this.<>1__state = -1);
                }
                yieldAwaiter.GetResult();
                yieldAwaiter = default(YieldAwaitable.YieldAwaiter);
            }
            catch (Exception arg_6E_0)
            {
                Exception exception = arg_6E_0;
                this.<>1__state = -2;
                this.<>t__builder.SetException(exception);
                return;
            }
            this.<>1__state = -2;
            this.<>t__builder.SetResult();
        }

        [DebuggerHidden]
        void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
        {
            this.<>t__builder.SetStateMachine(stateMachine);
        }
    }

    [AsyncStateMachine(typeof(C.<M>d__0))]
    public void M()
    {
        C.<M>d__0 <M>d__;
        <M>d__.<>t__builder = AsyncVoidMethodBuilder.Create();
        <M>d__.<>1__state = -1;
        AsyncVoidMethodBuilder <>t__builder = <M>d__.<>t__builder;
        <>t__builder.Start<C.<M>d__0>(ref <M>d__);
    }
}

请注意,使用awaiter而不是AwaitOnCompleted调用AwaitUnsafeOnCompleted.反过来,AwaitUnsafeOnCompleted在awaiter上调用UnsafeOnCompleted. YieldAwaiter does not在UnsafeOnCompleted中流动当前上下文.

这真让我困惑,因为this question似乎暗示Task.Yield确实捕获了当前的上下文;提问者很沮丧,因为缺乏一个没有的版本.所以我很困惑:产量是否捕获当前的背景?

如果没有,我怎么强迫它?我在UI线程上调用这个方法,我真的需要继续在UI线程上运行. YieldAwaitable缺少一个ConfigureAwait()方法,因此我无法编写等待Task.Yield().ConfigureAwait(true).

谢谢!

解决方法

The ExecutionContext is not the same as the context captured by await (which is usually a SynchronizationContext).

总而言之,必须始终为开发人员代码提供ExecutionContext;否则是一个安全问题.存在某些情况(例如,在编译器生成的代码中),其中编译器知道不流动是安全的(即,它将由另一机制流动).这基本上就是在这种情况下发生的事情,as traced by Peter.

但是,这与await捕获的上下文(当前的SynchronizationContext或TaskScheduler)没有任何关系.查看logic in YieldAwaiter.QueueContinuation:如果有当前的SynchronizationContext或TaskScheduler,则始终使用它并忽略flowContext参数.这是因为flowContext参数仅指流动ExecutionContext而不是SynchronizationContext / TaskScheduler.

相比之下,the task awaiters end up at Task.SetContinuationForAwait具有两个bool参数:continueOnCapturedContext用于确定是否捕获await上下文(SynchronizationContext或TaskScheduler),以及flowExecutionContext用于确定是否需要流动ExecutionContext.

Abp'FeatureManagementPermissions'在当前上下文中不存在

Abp'FeatureManagementPermissions'在当前上下文中不存在

如何解决Abp''FeatureManagementPermissions''在当前上下文中不存在?

我正在使用Abp,并且从模板文件夹运行应用程序项目。它工作正常,但我在租户部分遇到了问题。实际上,当我单击“租户管理”部分时,出现此错误

abp\modules\tenant-management\src\Volo.Abp.TenantManagement.Web\Pages\TenantManagement\Tenants\Index.cshtml

The name ''FeatureManagementPermissions'' does not exist in the current context
+
@if (await Authorization.IsGrantedAsync(FeatureManagementPermissions.ManageHostFeatures))

解决方法

我应该尝试运行build-all.ps1。 https://github.com/abpframework/abp/blob/dev/build/build-all.ps1

AnnotationConfigApplicationContext和父上下文

AnnotationConfigApplicationContext和父上下文

我在尝试使用定义上下文层次结构时遇到问题AnnotationConfigApplicationContext

问题是在内部定义模块上下文beanRefContext.xml并使用另一个上下文(基于XML / Annotated)设置’parent’属性时。

例:

模块A中的beanRefContext.xml

<bean id =“ moduleA_ApplicationContext”  
      class =“ org.springframework.context.support.ClassPathXmlApplicationContext”>
    <property name =“ configLocations”>
        <列表>
            <value> classpath:db-context.xml </ value>
        </ list>
    </ property>
</ bean>

db-context.xml

<bean id =“ dataSource” 
      class =“ org.apache.commons.dbcp.BasicDataSource” 
      destroy-method =“ close”
      p:driverClassName =“ org.h2.Driver”
      p:url =“ jdbc:h2:mem:testdb; DB_CLOSE_DELAY = -1; MODE = MySQL; TRACE_LEVEL_SYSTEM_OUT = 2” />

<!-休眠会话工厂->
<bean name =“ sessionFactory” 
      class =“ org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean”>
        <property name =“ dataSource” ref =“ dataSource” />
        <property name =“ useTransactionAwareDataSource” value =“ true” />
        <property name =“ packagesToScan”>
            <列表>
                <value> com.example.model </ value>
            </ list>
        </ property>
        <property name =“ hibernateProperties”>
        <!-冬眠道具->
        </ property>
</ bean>

模块B中的beanRefContext.xml

<bean id =“ moduleB_ApplicationContext” 
      class =“ org.springframework.context.annotation.AnnotationConfigApplicationContext”>
    <property name =“ parent” ref =“ moduleA_ApplicationContext” />
        <constructor-arg>
            <列表>
                <value> com.example.dao </ value>
            </ list>
        </ constructor-arg>
</ bean>

冬眠道

FooHibernateDao类实现FooDao {
    @Autowired
    @Qualifier(“ sessionFactory”)
    私有SessionFactory sessionFactory;

    // CRUD方法
}

模块B应用程序上下文无法找到在模块A应用程序上下文中定义的bean。
从代码AnnotationConfigApplicationContext看,扫描过程似乎没有使用父对象作为解析bean的参考。

我有做错什么吗,或者使用注释配置无法创建层次结构?

ASP.net MVC C# 当前上下文中不存在名称

ASP.net MVC C# 当前上下文中不存在名称 "viewbag"

出现的错误如下:

错误 2 当前上下文中不存在名称 “model” e:\Stuff\projects\ 蓝狐软件工作室 \src\Lanhu.Admin\Views\Student\Index.cshtml 3 2 Lanhu.Admin

错误 7 “System.Web.WebPages.Html.HtmlHelper” 不包含 “BeginForm” 的定义,并且找不到可接受类型为 “System.Web.WebPages.Html.HtmlHelper” 的第一个参数的扩展方法 “BeginForm”(是否缺少 using 指令或程序集引用?) e:\Stuff\projects\ 蓝狐软件工作室 \src\Lanhu.Admin\Views\Student\Index.cshtml 12 26 Lanhu.Admin

错误 9 当前上下文中不存在名称 “ViewBag” e:\Stuff\projects\ 蓝狐软件工作室 \src\Lanhu.Admin\Views\Student\Index.cshtml 16 115 Lanhu.Admin


错误 11 当前上下文中不存在名称 “Url” e:\Stuff\projects\ 蓝狐软件工作室 \src\Lanhu.Admin\Views\Student\Index.cshtml 48 47 Lanhu.Admin


错误 12 “System.Web.WebPages.Html.HtmlHelper” 不包含 “BeginForm” 的定义,并且找不到可接受类型为 “System.Web.WebPages.Html.HtmlHelper” 的第一个参数的扩展方法 “BeginForm”(是否缺少 using 指令或程序集引用?) e:\Stuff\projects\ 蓝狐软件工作室 \src\Lanhu.Admin\Views\Student\Index.cshtml 49 50 Lanhu.Admin

 

 

解决办法  删除  C:\Users\(用户名)\AppData\Local\Microsoft\VisualStudio\(版本)\ComponentModelCache 文件夹.

asp.net-core – 当前上下文中不存在名称“SqlServerValueGenerationStrategy”

asp.net-core – 当前上下文中不存在名称“SqlServerValueGenerationStrategy”

我正在使用ASP.NET Core 2.1.在我创建API项目后,我运行以下命令

Add-Migration MOBAPP -Project OVMInfrastructure
Update-Database

当我运行update-database时,我收到此错误:

The name “sqlServerValueGenerationStrategy” does not exist in the current context

我重新安装了以下Nuget包

Microsoft.EntityFrameworkCore.sqlServer

但它仍然无法正常工作.

Click here to see my error picture.

解决方法

按照以下步骤:

>在JSAInfrastructure中安装Microsoft.EntityFrameworkCore版本2.1.0包
>在JSAInfrastructure中安装Microsoft.EntityFrameworkCore.Relational版本2.1.0包
>在JSAInfrastructure中安装Microsoft.EntityFrameworkCore.sqlServer版本2.1.0包
>在JSAAPI中将Microsoft.EntityFrameworkCore.sqlServer更新为2.1.0版
>构建您的项目

Result

今天关于c# – Task.Yield是否真的在当前上下文中运行了continuation?c#当前上下文中不存在的介绍到此结束,谢谢您的阅读,有关Abp'FeatureManagementPermissions'在当前上下文中不存在、AnnotationConfigApplicationContext和父上下文、ASP.net MVC C# 当前上下文中不存在名称 "viewbag"、asp.net-core – 当前上下文中不存在名称“SqlServerValueGenerationStrategy”等更多相关知识的信息可以在本站进行查询。

本文标签: