Skip to content

Instantly share code, notes, and snippets.

@juner
Created March 2, 2018 08:27
Show Gist options
  • Save juner/278f003fab037bbe8d64764cbd7ad3c3 to your computer and use it in GitHub Desktop.
Save juner/278f003fab037bbe8d64764cbd7ad3c3 to your computer and use it in GitHub Desktop.
Application.DoEvent() 使ってるので負けな気持ちだけど、memoしとく。Application.DoEvent() 使わない為にはどーすればええんだろか。
/// <summary>
/// 非同期 -> 固まらない同期
/// </summary>
/// <typeparam name="T">非同期処理の戻りの型</typeparam>
/// <param name="RunAsync">非同期処理</param>
/// <param name="Factory">スレッドを選択するファクトリー</param>
/// <param name="Waiter">待つ為の関数</param>
/// <returns></returns>
private static T RunSync<T>(Func<Task<T>> RunAsync, TaskFactory Factory = null, Action Waiter = null)
{
var taskComp = new HashSet<TaskStatus>(new[] { TaskStatus.RanToCompletion, TaskStatus.Canceled, TaskStatus.Faulted });
var task = (Factory ?? Task.Factory).StartNew(async () => await RunAsync()).Unwrap();
if (Waiter == null)
Waiter = System.Windows.Forms.Application.DoEvents;
while (!taskComp.Contains(task.Status))
Waiter();
switch (task.Status)
{
case TaskStatus.RanToCompletion:
return task.Result;
case TaskStatus.Faulted:
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(task.Exception.InnerException).Throw();
break;
case TaskStatus.Canceled:
throw new TaskCanceledException();
}
return default(T);
}
/// <summary>
/// 非同期 -> 固まらない同期
/// </summary>
/// <param name="RunAsync">非同期処理</param>
/// <param name="Factory">スレッドを選択するファクトリー</param>
/// <param name="Waiter">待つ為の関数</param>
private static void RunSync(Func<Task> RunAsync, TaskFactory Factory = null, Action Waiter = null)
{
var taskComp = new HashSet<TaskStatus>(new[] { TaskStatus.RanToCompletion, TaskStatus.Canceled, TaskStatus.Faulted });
var task = (Factory ?? Task.Factory).StartNew(async () => await RunAsync()).Unwrap();
if (Waiter == null)
Waiter = System.Windows.Forms.Application.DoEvents;
while (!taskComp.Contains(task.Status))
Waiter();
switch (task.Status)
{
case TaskStatus.RanToCompletion:
return;
case TaskStatus.Faulted:
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(task.Exception.InnerException).Throw();
break;
case TaskStatus.Canceled:
throw new TaskCanceledException();
}
return;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment