Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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# 正在使用wait Task.Run(()=>;良好实践)等待来自同步源的方法吗?_C#_Asp.net - Fatal编程技术网

C# 正在使用wait Task.Run(()=>;良好实践)等待来自同步源的方法吗?

C# 正在使用wait Task.Run(()=>;良好实践)等待来自同步源的方法吗?,c#,asp.net,C#,Asp.net,我有一个带有async关键字的方法,该方法返回一个字符串,该字符串来自JwtSecurityTokenHandler().WriteToken(t);问题是,方法主体中的任何赋值都是不可等待的。我得到了警告CS-1998。它说,同步方法不应该使用异步,这是完全有意义的。但是,它补充说,您可以使用等待任务。运行(()=>{。这样做是好的做法吗 public async Task<object> GenerateMyUserJwtToken(string email, IdentityU

我有一个带有async关键字的方法,该方法返回一个字符串,该字符串来自
JwtSecurityTokenHandler().WriteToken(t);
问题是,方法主体中的任何赋值都是不可等待的。我得到了警告CS-1998。它说,同步方法不应该使用异步,这是完全有意义的。但是,它补充说,您可以使用
等待任务。运行(()=>{
。这样做是好的做法吗

public async Task<object> GenerateMyUserJwtToken(string email, IdentityUser user)
//code that isnt awaitable
        {
var u = await Task.Run(() =>
            {
                return new JwtSecurityTokenHandler().WriteToken(token);
            });

            return  u;
}
public async Task GenerateMyUserJwtToken(字符串电子邮件,IdentityUser用户)
//不可等待的代码
{
var u=等待任务。运行(()=>
{
返回新的JwtSecurityTokenHandler().WriteToken(令牌);
});
返回u;
}
编辑:我没有问错误是什么,我问的是实现wait任务是否是一个好主意。在没有wait赋值的异步方法签名上运行(())。我还问另一个异步方法正在另一个方法中等待此操作。下面是代码

//等待方法:

public async Task<object> LoginAsync(LoginDto model)
        {

                return await GenerateMyUserJwtToken(model.Email, appUser);

        }



//controller:
    [HttpPost("login")]
            public async Task<object> Login([FromBody] LoginDto model)
            {


      var logMeIn = await new AuthUserService().LoginAsync(model);
                return logMeIn; //returns token


            }
public异步任务LoginAsync(LoginDto模型)
{
return wait GenerateMyUserJwtToken(model.Email,appUser);
}
//控制器:
[HttpPost(“登录”)]
公共异步任务登录([FromBody]登录到模型)
{
var logMeIn=wait new AuthUserService().LoginAsync(model);
return logMeIn;//返回令牌
}

我的问题是,这是一路异步还是任务。运行停止该进程?

使用
任务。运行
只是使某个东西同步通常是一种不好的做法,但不能笼统地说

如果要执行的同步方法可能需要很长时间,那么它可能是一个解决方案。请注意,
Task.Run
会将任务分配给池线程,这并不总是可取的。异步方法总是使用或应该使用异步等待链末端的某个线程,这是一个常见的误解。但是,异步等待它是关于异步性(链接延迟任务)的,创建线程只是创建等待任务的一个选项

那么有什么选择呢

  • 要调用的方法很快,并且不会长时间阻止调用方(>100ms左右):根本不使用异步。在这种情况下,
    Task.FromResult(result)
    是一个诱人的解决方案,但不鼓励使用,因为这会误导调用者。仅在单元测试中使用,或者在您被迫实现无法更改的接口的异步方法时使用

  • 方法执行需要很长时间,因为它受CPU限制:现在您可以使用线程。但是我通常不会在持久任务中使用池线程,因为如果线程池没有线程,它可能会导致严重的副作用。请使用
    wait Task.Factory.StartNew(()=>MyLongRunningTask(),cancellationToken,TaskCreationOptions.LongRunning);
    相反,它创建了一个全新的线程,而不是干扰池

  • 方法执行需要很长时间,因为它是IO绑定的(例如,通过硬件发送/接收数据包):使用
    taskcompletionsource
    ,将钩子添加到设备的任何完成事件(例如,OS钩子或IRQ通知),并从中设置完成源的结果并返回其任务


  • 使用
    Task.Run
    只是为了同步某些东西通常是一种不好的做法,但不能笼统地说明

    如果要执行的同步方法可能需要很长时间,那么它可能是一个解决方案。请注意,
    Task.Run
    会将任务分配给池线程,这并不总是可取的。异步方法总是使用或应该使用异步等待链末端的某个线程,这是一个常见的误解。但是,异步等待它是关于异步性(链接延迟任务)的,创建线程只是创建等待任务的一个选项

    那么有什么选择呢

  • 要调用的方法很快,并且不会长时间阻止调用方(>100ms左右):根本不使用异步。在这种情况下,
    Task.FromResult(result)
    是一个诱人的解决方案,但不鼓励使用,因为这会误导调用者。仅在单元测试中使用,或者在您被迫实现无法更改的接口的异步方法时使用

  • 方法执行需要很长时间,因为它受CPU限制:现在您可以使用线程。但是我通常不会在持久任务中使用池线程,因为如果线程池没有线程,它可能会导致严重的副作用。请使用
    wait Task.Factory.StartNew(()=>MyLongRunningTask(),cancellationToken,TaskCreationOptions.LongRunning);
    相反,它创建了一个全新的线程,而不是干扰池

  • 方法执行需要很长时间,因为它是IO绑定的(例如,通过硬件发送/接收数据包):使用
    taskcompletionsource
    ,将钩子添加到设备的任何完成事件(例如,OS钩子或IRQ通知),并从中设置完成源的结果并返回其任务


  • 链接:如果你想传播你的异步代码,但是你的一些方法是同步的,那么使用<代码>任务。FultRebug < /C> >是很好的。它将同步运行,但是可以让你在应用程序中进一步传播异步。帖子可以澄清。当使用<代码>等待任务时,运行。基本上,你想让<代码> UI 线程处理运行的异步代码,例如从处理程序。嘿,谢谢你回答了我的问题。可能的复制任务。从FRESRESTI中继续阅读博客不要使用它。链接:如果你想传播你的异步代码,但是你的一些我。方法是同步的,然后使用
    任务。FromResult
    很好。它将运行synchronousl