한 번에 하나의 작업을 실행할 수있는 간단한 작업 대기열이 있습니다.
public class TaskQueue
{
public SemaphoreSlim semaphore;
public TaskQueue()
{
semaphore = new SemaphoreSlim(1);
}
public async Task<T> Enqueue<T>(Func<Task<T>> taskGenerator)
{
await semaphore.WaitAsync();
try
{
return await taskGenerator();
}
finally
{
semaphore.Release();
}
}
public async Task Enqueue(Func<Task> taskGenerator)
{
await semaphore.WaitAsync();
try
{
await taskGenerator();
}
finally
{
semaphore.Release();
}
}
}
그리고 다음과 같이 작업을 대기열에 넣습니다.
private async Task SaveData()
{
//some code
await taskQueue.Enqueue(async () => { printed = await pm.Print(Template); });
//some code
}
이제 내가하고 싶은 것은 Enqueue
메서드 내부 에 정보가 포함될 로그를 추가하는 것 $Print was called with parameter {Template}
입니다. 실행 된 메소드의 이름과 매개 변수를 어떻게 얻을 수 있습니까?
[CallerMemberName] string caller = ""
호출이 내부 SaveData
에서 이루어 졌다는 정보를 얻을 수 있다는 것을 알고 있지만 원하는 정보를 기록 할 속성이나 무언가가 있습니까?
이것은 가능하지만 (표현식 트리 등) 매우 비효율적입니다. 아마도 더 나은 방법은 객체를 대기열에 넣는 것입니다.
abstract class ThingToDo {
public abstract Task DoTheThingAsync();
}
큐를 ThingToDo
대신 큐로 만들면 Func<Task<T>>
다음과 같은 것을 가질 수 있습니다.
sealed class PrintThing : ThingToDo {
private readonly int x;
private readonly string y;
private readonly string caller;
public PrintThing(int x, string y, [CallerMemberName] string caller = null) {
this.x = x;
this.y = y;
this.caller = caller;
}
public override Task DoTheThingAsync() {...}
public override ToString() => $"{nameof(PrintThing)}, x={x}, y={y} from {caller}";
}
이제 작업을 간단하게 출력 할 수 있습니다.
실제로,이 모든 컴파일러가 생성 될지에 그 차이가 없다 어쨌든 캡처 변수 람다 / 익명 방법에 대해.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다