0条评论
还没有人评论过~
.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的姿势不对吗?
首先async await的死锁的问题LZ需要去了解下。
其次我理解LZ的需求是 初始化一个容器,装载一些需要任务 需要去异步执行。这里我认为完全没必要把Task装载到容器中。完全可以定义一个接口
public interface Mission
{
int Do(object para);
}
各类任务实现这个接口装载到容器中。取出来的时候再 Task.Run() 异步执行。
不知是否理解有误。
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;
}
}
C# Task用法
https://www.e-learn.cn/content/net/1114080
你表演一个相声我就回答你