, , async void MainAsync, async Task. , (async void ), , .
async Task . , Task ( ) , task.Result, task.Wait(), await task task.GetAwaiter().GetResult().
: TAP .
AsyncPump, , (.. , ), TaskScheduler.Current TaskScheduler.FromCurrentSynchronizationContext():
class PumpingSyncContext : SynchronizationContext
{
BlockingCollection<Action> _actions;
int _pendingOps = 0;
public TResult Run<TResult>(Func<Task<TResult>> taskFunc, CancellationToken token = default(CancellationToken))
{
_actions = new BlockingCollection<Action>();
SynchronizationContext.SetSynchronizationContext(this);
try
{
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = Task.Factory.StartNew(
async () =>
{
OperationStarted();
try
{
return await taskFunc();
}
finally
{
OperationCompleted();
}
},
token, TaskCreationOptions.None, scheduler).Unwrap();
foreach (var action in _actions.GetConsumingEnumerable())
action();
return task.GetAwaiter().GetResult();
}
finally
{
SynchronizationContext.SetSynchronizationContext(null);
}
}
void Complete()
{
_actions.CompleteAdding();
}
public override SynchronizationContext CreateCopy()
{
return this;
}
public override void OperationStarted()
{
Interlocked.Increment(ref _pendingOps);
}
public override void OperationCompleted()
{
if (Interlocked.Decrement(ref _pendingOps) == 0)
Complete();
}
public override void Post(SendOrPostCallback d, object state)
{
_actions.Add(() => d(state));
}
public override void Send(SendOrPostCallback d, object state)
{
throw new NotImplementedException("Send");
}
}
:
return task.GetAwaiter().GetResult();
:
return task.Result;
AggregateException, AggregateException.InnerException async.