我现在的同步代码是这样的:
class Program
{
static void Main(string[] args)
{
Test("A");
}
static void Test(string str)
{
switch (str)
{
case "A":
TestA();
break;
case "B":
TestB();
break;
default:
break;
}
}
static void TestA()
{
//处理xx问题
Console.WriteLine("TestA处理完毕");
}
static void TestB()
{
//处理xx问题
Console.WriteLine("TestB处理完毕");
}
}
我想把TestA和TestB变成异步方法 Test方法是否需要也启动一个Task 比如这样:
class Program
{
static async Task Main(string[] args)
{
await Test("A");
}
static async Task Test(string str)
{
await Task.Run(() =>
{
switch (str)
{
case "A":
_ = TestA();
break;
case "B":
_ = TestB();
break;
default:
break;
}
});
}
static async Task TestA()
{
await Task.Run(() =>
{
//处理xx问题
Console.WriteLine("TestA处理完毕");
});
}
static async Task TestB()
{
await Task.Run(() =>
{
//处理xx问题
Console.WriteLine("TestB处理完毕");
});
}
}
TestA和TestB相当于一个后台任务,成功和失败我都不需要去管,有必要把Test方法也启动一个Task吗,记得异步就是要异步到底,只要有一个方法用async修饰了,那么所有与这个方法有关的方法都需要用async修饰,那我这种情况,给Test启动了一个Task是对的吗,有没有什么性能损失呢,还是直接这么调:
static void Test(string str)
{
switch (str)
{
case "A":
_ = TestA();
break;
case "B":
_ = TestB();
break;
default:
break;
}
}
或者:
static async Task Test(string str)
{
switch (str)
{
case "A":
await TestA();
break;
case "B":
await TestB();
break;
default:
break;
}
}
你 Task.Run(()=>switch)的时候 已经用另一个线程去异步执行switch里的代码了 Task&B不用再去Task.Run了 凡是调用了含异步代码的函数 都可以标注为async
如果Test方法里面在switch前面有别的耗时操作,这个耗时操作和TestA还有TestB互不影响,可以同步运行是不是就需要
Task.Run(()=>
//执行耗时操作
switch
)
然后TestA还有TestB也需要Task.Run
@咬轮猫: 可以的 但是别在task.run前加await
@彭小立: 请问是哪个方法不加await呢 Test还是TestA B呢 不加的话 编译器会提示警告啊 要把async也去掉吗
@咬轮猫: 加await会等待Task执行完之后才会向下执行 一般都是为了同步执行防止主线程阻塞
不过看你的需求 应该是为了开启后台线程吧 那可以用 ThreadLocal 你可以google一下这个的用法
我用的也不多 别误导你了
@彭小立: 我先研究一下 谢谢您
异步不会加快处理速度,提升的是线程利用率,如果一个方法,由同步改为异步,该多快还是多快,只是吞吐率提升了
是不是Test方法里面有别的耗时操作就用Task Run,否则就用最后一种
– 咬轮猫 4年前