1

以以下方法为例:

public async ValueTask<int> MyMethod() {
    return await GetMyIntegerWithTask();
}

public async Task<int> GetMyIntegerWithTask() {
   if (/*in hot path*/) {
      return await SynchronousMethodThatUsesTask();
   } 
   return await AsynchronousMethodThatUsesTask();
}

public Task<int> SynchronousMethodThatUsesTask() {
   int value = new Random().Next();
   return Task.FromResult(value); 
}

public async Task<int> AsynchronousMethodThatUsesTask() {
   //some asynchronous calculation 
}

使用ValueTask作为返回类型是否MyMethod仍然具有相关的优势,ValueTask因为我希望大部分时间我的代码将同步执行(即使我依赖于返回Task而不是同步方法ValueTask)?

4

1 回答 1

1

使用 ValueTask 作为 MyMethod 的返回类型是否仍然具有与 ValueTask 相关的优势,因为我希望大部分时间我的代码将同步执行(即使我依赖的同步方法返回 Task 而不是 ValueTask)?

的性能优势ValueTask很小,除非您经常调用它。也就是说,是ValueTask的,至少会避免Task分配,并且在同步情况下也避免将状态机结构装箱到堆上。

如果两者都使用会更好但即使没有,至少也可以避免一些分配。GetMyIntegerWithTaskSynchronousMethodThatUsesTaskValueTask<int>MyMethodValueTask<int>

于 2021-03-27T01:30:44.250 回答