[c#] 인터페이스에서 작업을 반환해야하는 경우 아무 작업도 구현하지 않는 가장 좋은 방법은 무엇입니까?



1 Answers

Task.FromResult 사용에 대한 Reed Copsey의 답변 에 추가하면 완성 된 작업의 모든 인스턴스가 동일하기 때문에 이미 완료된 작업을 캐시하면 성능을 더욱 향상시킬 수 있습니다.

public static class TaskExtensions
{
    public static readonly Task CompletedTask = Task.FromResult(false);
}

TaskExtensions.CompletedTask 를 사용하면 전체 앱 도메인에서 동일한 인스턴스를 사용할 수 있습니다.

.Net Framework (v4.6)최신 버전은 Task.CompletedTask 정적 속성과 함께 추가되었습니다.

Task completedTask = Task.CompletedTask;
Question

아래의 코드에서 인터페이스 때문에 LazyBar 클래스는 메서드에서 작업을 반환해야합니다 (및 변경할 수없는 인수의 경우). LazyBar 구현이 신속하고 동 기적으로 실행된다는 점에서 비정상적인 경우 - 메소드에서 작업 없음 작업을 반환하는 가장 좋은 방법은 무엇입니까?

나는 Task.Delay(0) 가지고 갔다. Task.Delay(0) 함수가 많이 호출되면 성능상의 부작용이 있는지 알고 싶다. (인수를 위해서, 초당 수백 번 말한다) :

  • 이 통설적인 설탕은 무언가 큰 것에 un-wind인가?
  • 그것은 내 응용 프로그램의 스레드 풀을 막히기 시작합니까?
  • 컴파일러는 Delay(0) 다르게 처리 할 수 ​​있습니까?
  • return Task.Run(() => { }); 것입니다 return Task.Run(() => { }); 다른 건가요?

더 좋은 방법이 있습니까?

using System.Threading.Tasks;

namespace MyAsyncTest
{
    internal interface IFooFace
    {
        Task WillBeLongRunningAsyncInTheMajorityOfImplementations();
    }

    /// <summary>
    /// An implementation, that unlike most cases, will not have a long-running
    /// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations'
    /// </summary>
    internal class LazyBar : IFooFace
    {
        #region IFooFace Members

        public Task WillBeLongRunningAsyncInTheMajorityOfImplementations()
        {
            // First, do something really quick
            var x = 1;

            // Can't return 'null' here! Does 'Task.Delay(0)' have any performance considerations?
            // Is it a real no-op, or if I call this a lot, will it adversely affect the
            // underlying thread-pool? Better way?
            return Task.Delay(0);

            // Any different?
            // return Task.Run(() => { });

            // If my task returned something, I would do:
            // return Task.FromResult<int>(12345);
        }

        #endregion
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            Test();
        }

        private static async void Test()
        {
            IFooFace foo = FactoryCreate();
            await foo.WillBeLongRunningAsyncInTheMajorityOfImplementations();
            return;
        }

        private static IFooFace FactoryCreate()
        {
            return new LazyBar();
        }
    }
}



최근에이 문제가 발생하여 메소드에 대한 경고 / 오류가 계속 유실되었습니다.

우리는 컴파일러를 placating하는 업무에 종사하고 있습니다.

    public async Task MyVoidAsyncMethod()
    {
        await Task.CompletedTask;
    }

이것은 지금까지 모든 조언 중에서 가장 좋은 것을 모았습니다. 실제로 메소드에서 무언가를하지 않는 한 return 문이 필요하지 않습니다.




Related