110,571
社区成员
发帖
与我相关
我的任务
分享
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication96.Controllers
{
public class HomeController : Controller
{
public async Task<int> Index1()
{
TA ta = new TA();
return await ta.AddVal(10, 100);
//这里输出:TA_AddVal ,线程ID :8 TA_Add ,线程ID :8 TA_Add_Task ,线程ID :9
}
public async Task<int> Index2()
{
TA2 ta = new TA2();
return await ta.AddVal(10, 100);
//这里输出:TA2_AddVal ,线程ID :9 TA2_Add ,线程ID :9 TA2_Add_Task ,线程ID :8
}
}
public class TA
{
public async Task<int> Add(int x, int y)
{
WR.ConsoleWrite("TA_Add");
var ret = Task.Run<int>(() =>
{
WR.ConsoleWrite("TA_Add_Task");
Task.Delay(1000);
return x + y;
});
return await ret;
}
/// <summary>
/// 1 这里直接返回Task,同步执行
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public Task<int> AddVal(int x, int y)
{
WR.ConsoleWrite("TA_AddVal");
return Add(x, y);
}
}
public class TA2
{
public async Task<int> Add(int x, int y)
{
WR.ConsoleWrite("TA2_Add");
var ret = Task.Run<int>(() =>
{
WR.ConsoleWrite("TA2_Add_Task");
Task.Delay(1000);
return x + y;
});
return await ret;
}
/// <summary>
/// 2 这里直接返回异步Task,异步执行
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public async Task<int> AddVal(int x, int y)
{
/*
为何 在调用“await ta.AddVal(10, 100)”时,这里没有开启新的线程?
*/
WR.ConsoleWrite("TA2_AddVal");
return await Add(x, y);
}
}
public static class WR
{
public static void ConsoleWrite(string name)
{
var id = Thread.CurrentThread.ManagedThreadId.ToString();
//Console.WriteLine($"{name} ,线程ID :{id}");
var str = $"{name} ,线程ID :{id}";
Debugger.Log(1, "", str);
}
}
}
public Task<int> AddVal(int x, int y)
{
WR.ConsoleWrite("TA_AddVal");
return Add(x, y);
}
public async Task<int> AddVal(int x, int y)
{
/*
为何 在调用“await ta.AddVal(10, 100)”时,这里没有开启新的线程?
*/
WR.ConsoleWrite("TA2_AddVal");
return await Add(x, y);
}
public Task test()
{
var task = Task.Run(() =>
{
.....................
});
await task;
}
public Task test()
{
var task = Task.Run(() =>
{
.....................
});
return task;
}
结果你写成了public Task test()
{
var task = Task.Run(() =>
{
.....................
});
await task;
}
此异步方法缺少 "await" 运算符,将以同步方式运行。请考虑使用 "await" 运算符等待非阻止的 API 调用,或者使用 "await Task.Run(...)" 在后台线程上执行占用大量 CPU 的工作