-->

.NET MVC中异步启动Task,await无法正常执行

2019-10-31 20:02发布

问题:

.NET Standard 2.0写的类库

代码思路大致如下

public class MyService
{
    public ConcurrentQueue<Task> TaskList = new ConcurrentQueue<Task>();

    public async Task<int> Run()
    {
        var task = new Task<int>(Mission, "ffff");
        list.Enqueue(task);
        return await task;
    }

    public int Mission(object para)
    {
        //do someting
        return num;
    }
}
TaskList 会在外部的某个地方异步调用,并启动列队里的Task

这种写法在控制台引用程序里,执行 new MyService().Run().Result ,可以正常运行。

但是在MVC的项目里,同样的方法调用上面的代码,await task以后的代码无法被执行到,但是debug的时候mission内部的代码的确执行了。

请问这是什么原因,是我使用Task的姿势不对吗?

回答1:

首先async await的死锁的问题LZ需要去了解下。
其次我理解LZ的需求是 初始化一个容器,装载一些需要任务 需要去异步执行。这里我认为完全没必要把Task装载到容器中。完全可以定义一个接口
public interface Mission
{
int Do(object para);
}
各类任务实现这个接口装载到容器中。取出来的时候再 Task.Run() 异步执行。
不知是否理解有误。



回答2:

Task.Run 闪亮登场

public class MyService
{
    public ConcurrentQueue<Task> TaskList = new ConcurrentQueue<Task>();

    public async Task<int> Run()
    {
        var task = Task.Run<int>(() => Mission("ffff"));
        TaskList.Enqueue(task);
        return await task;
    }

    public int Mission(object para)
    {
        Console.WriteLine("Doing a mission");
        return 1;
    }
}


回答3:

C# Task用法
https://www.e-learn.cn/content/net/1114080



回答4:

你表演一个相声我就回答你