Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 电子邮件确认导致错误_C#_Multithreading_Entity Framework_Asynchronous_Identity - Fatal编程技术网

C# 电子邮件确认导致错误

C# 电子邮件确认导致错误,c#,multithreading,entity-framework,asynchronous,identity,C#,Multithreading,Entity Framework,Asynchronous,Identity,我对线程和C#相当陌生。我试图实现标识,但遇到了一个问题:当我注册用户并发送确认链接时,单击该链接会导致异常: 我尽力简化我的代码来解释这个问题 因此,我的MVC项目控制器中有AccountController: namespace SolwayOrder.Controllers{ 公共类AccountController:控制器{ 专用只读应用程序服务器管理器\u管理器; 私有只读签名管理器\u签名; 专用只读角色管理器\u角色管理器; 公共账户控制员( 应用程序管理员, SignInMana

我对线程和C#相当陌生。我试图实现标识,但遇到了一个问题:当我注册用户并发送确认链接时,单击该链接会导致异常:

我尽力简化我的代码来解释这个问题

因此,我的MVC项目控制器中有
AccountController

namespace SolwayOrder.Controllers{
公共类AccountController:控制器{
专用只读应用程序服务器管理器\u管理器;
私有只读签名管理器\u签名;
专用只读角色管理器\u角色管理器;
公共账户控制员(
应用程序管理员,
SignInManagersignIn,
角色管理器角色管理器
) {
_经理=经理;
_signIn=signIn;
_roleManager=roleManager;
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务寄存器(RegisterModel,string returnUrl){
if(ModelState.IsValid){
var user=新标识用户(model.Email);
var result=wait_manager.CreateAsync(用户、模型、密码);
if(result.successed){
var code=wait\u manager.generateemailconfimationtokenasync(model.Email);var callbackUrl=Url.Action(
“确认邮件”、“帐户”,
新的{
userId=model.Email,code=code
},
协议:Request.Url.Scheme);
wait_manager.sendmailasync(model.Email,
“确认您的帐户”,
“请单击此链接确认您的帐户:”;
返回内容(“请确认您的帐户。链接已发送到”+model.Email);
}
}
返回视图();
}
[HttpGet]
公共异步任务确认邮件(字符串用户ID,字符串代码){
if(userId==null | | code==null)返回视图(“寄存器”);//错误
var result=await\u manager.confirmemailsync(用户ID,代码);
if(result.successed){
返回视图();
}
返回视图(“寄存器”);
}
}
}
当我单击电子邮件上的链接时出现问题:

A second operation started on this context before a previous asynchronous operation completed. Use 'await' to ensure that any asynchronous operations have completed before calling another method on this context. Any instance members are not guaranteed to be thread safe. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NotSupportedException: A second operation started on this context before a previous asynchronous operation completed. Use 'await' to ensure that any asynchronous operations have completed before calling another method on this context. Any instance members are not guaranteed to be thread safe.

Source Error: 


Line 29: 
Line 30:         public async Task<User> FindByUserNameAsync(string username) {
Line 31:             return await Set.FirstOrDefaultAsync(x => x.Email == username);
Line 32:         }
Line 33: 

Source File: C:\Users\Solway\documents\visual studio 2017\Projects\SolwayOrder\SolwayOrder.Repo\Repositories\UserRepository.cs    Line: 31 
在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在此上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能保证线程安全。
描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。
异常详细信息:System.NotSupportedException:在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在此上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能保证线程安全。
源错误:
第29行:
第30行:公共异步任务FindByUserNameAsync(字符串用户名){
第31行:return wait Set.FirstOrDefaultAsync(x=>x.Email==username);
第32行:}
第33行:
源文件:C:\Users\Solway\documents\visual studio 2017\Projects\SolwayOrder\SolwayOrder.Repo\Repositories\UserRepository.cs行:31
我对它进行了修改,使其适用于异步方法,在返回任务的地方,我有async和Wait

很抱歉,无法进一步简化问题,我认为这是常见的模式,应该可以理解。如果没有,这里有一个完整项目的链接:

完整堆栈:
[NotSupportedException:在上一个异步操作完成之前,在此上下文上启动了第二个操作。在调用此上下文上的另一个方法之前,请使用“等待”确保所有异步操作都已完成。不保证任何实例成员都是线程安全的。]
System.Data.Entity.Internal.ThrowingMonitor.EncurrenoTenterned()+72
System.Data.Entity.Core.Objects.ObjectQuery`1.System.Data.Entity.Infrastructure.IDBSyncEnumerable.GetAsyncEnumerator()+22
System.Data.Entity.Infrastructure.d_u25`1.MoveNext()+114
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)+99
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务)+58
System.Runtime.CompilerServices.TaskWaiter`1.GetResult()+28
C:\Users\Solway\documents\visual studio 2017\Projects\SolwayOrder\SolwayOrder.Repo\Repo\Repositories\UserRepository.cs:31中的SolwayOrder.Repo.d\uuu 5.MoveNext()
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)+99
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务)+58
System.Runtime.CompilerServices.TaskWaiter`1.GetResult()+28
C:\Users\Solway\documents\visual studio 2017\Projects\SolwayOrder\SolwayOrder.Service\Security.cs:40中的SolwayOrder.Service.d\uuu 7.MoveNext()
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)+99
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务)+58
System.Runtime.CompilerServices.TaskWaiter`1.GetResult()+28
C:\Users\Solway\documents\visual studio 2017\Projects\SolwayOrder\SolwayOrder\Identity\UserStore.cs:46中的SolwayOrder.Identity.d\uu 5.MoveNext()
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)+99
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务)+58
Microsoft.AspNet.Identity.CultureaWater`1.GetResult()+59
Microsoft.AspNet.Identity.d_u4.MoveNext()+589
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)+99
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务)+58
Microsoft.AspNet.I
full stack:


[NotSupportedException: A second operation started on this context before a previous asynchronous operation completed. Use 'await' to ensure that any asynchronous operations have completed before calling another method on this context. Any instance members are not guaranteed to be thread safe.]
   System.Data.Entity.Internal.ThrowingMonitor.EnsureNotEntered() +72
   System.Data.Entity.Core.Objects.ObjectQuery`1.System.Data.Entity.Infrastructure.IDbAsyncEnumerable<T>.GetAsyncEnumerator() +22
   System.Data.Entity.Infrastructure.<FirstOrDefaultAsync>d__25`1.MoveNext() +114
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
   System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +28
   SolwayOrder.Repo.<FindByUserNameAsync>d__5.MoveNext() in C:\Users\Solway\documents\visual studio 2017\Projects\SolwayOrder\SolwayOrder.Repo\Repositories\UserRepository.cs:31
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
   System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +28
   SolwayOrder.Service.<FindUserByNameAsync>d__7.MoveNext() in C:\Users\Solway\documents\visual studio 2017\Projects\SolwayOrder\SolwayOrder.Service\Security.cs:40
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
   System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +28
   SolwayOrder.Identity.<FindByNameAsync>d__5.MoveNext() in C:\Users\Solway\documents\visual studio 2017\Projects\SolwayOrder\SolwayOrder\Identity\UserStore.cs:46
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
   Microsoft.AspNet.Identity.CultureAwaiter`1.GetResult() +59
   Microsoft.AspNet.Identity.<ValidateUserName>d__4.MoveNext() +589
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
   Microsoft.AspNet.Identity.<ValidateAsync>d__0.MoveNext() +293
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
   Microsoft.AspNet.Identity.<UpdateAsync>d__5.MoveNext() +295
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
   Microsoft.AspNet.Identity.CultureAwaiter`1.GetResult() +59
   Microsoft.AspNet.Identity.<ConfirmEmailAsync>d__c5.MoveNext() +1100
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
   System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +28
   SolwayOrder.Controllers.<ConfirmEmail>d__8.MoveNext() in C:\Users\Solway\documents\visual studio 2017\Projects\SolwayOrder\SolwayOrder\Controllers\AccountController.cs:88
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
   System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +97
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeAsynchronousActionMethod>b__36(IAsyncResult asyncResult) +17
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
   System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +50
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +228
   System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +26
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36
   System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9987157
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
public Task<int> SaveChangesAsync(CancellationToken cancellationToken)
{
    return _context.SaveChangesAsync(cancellationToken);
}
public async Task<int> SaveChangesAsync(CancellationToken cancellationToken)
{
    using (var ctx = new AppDbContext())
    {
        return await ctx.SaveChangesAsync(cancellationToken);
    }
}
    public async Task<IdentityUser> FindByNameAsync(string userName) {
        var user = await _security.FindUserByNameAsync(userName);

        return getIdentityUser(user);

    }
    public async Task<User> FindUserByNameAsync(string userName) {
        return await _unitOfWork.UserRepository.FindByUserNameAsync(userName);
    }