Мне нужно выполнить несколько задач, которые необходимо запустить с использованием определенного планировщика, поскольку в противном случае они не будут работать, поскольку объекты, которые они создают, могут быть только из определенного потока.
Использование Task.Factory.StartNew
работает хорошо, единственное, что синтаксис немного громоздкий.
Итак, мне пришла в голову идея написать метод расширения, который мог бы позволить мне сохранить краткий синтаксис Task.Run
, но указать другой планировщик, чем TaskScheduler.Default
. Однако мне трудно понять, как написать такой метод расширения.
Вопрос:
Как изменить планировщик на Task.Run
, с которым он будет работать, если это вообще возможно?
Пример кода:
using System;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
private async void Test()
{
// game objects can only be created from Unity main thread, get its scheduler
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
// 1. syntax using factory, works but is a bit cumbersome
await Task.Factory.StartNew(
() => new GameObject("test"),
CancellationToken.None,
TaskCreationOptions.None,
scheduler
);
// 2. ideal syntax though it will fail since it'll run with the wrong scheduler
await Task.Run(() => new GameObject("test"));
// 3. ideal syntax but how to implement .Schedule method?
await Task.Run(() => new GameObject("test")).Schedule(scheduler);
}
}
Метод расширения:
public static class Extensions
{
public static Task<T> Schedule<T>(this Task<T> task, TaskScheduler scheduler)
{
// how, if possible at all to write this method?
throw new NotImplementedException();
}
}