thread startnew method create continuewith async c# task

startnew - task vs thread c#



Establecer ApartmentState en una tarea (3)

Cuando StartNew falla, hágalo usted mismo:

public static Task<T> StartSTATask<T>(Func<T> func) { var tcs = new TaskCompletionSource<T>(); Thread thread = new Thread(() => { try { tcs.SetResult(func()); } catch (Exception e) { tcs.SetException(e); } }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); return tcs.Task; }

(Puede crear uno para Task que se verá casi idéntico, o agregar sobrecargas para algunas de las diversas opciones que tiene StartNew ).

Estoy intentando establecer el estado del departamento en una tarea, pero no veo ninguna opción para hacerlo. ¿Hay alguna manera de hacer esto usando una Tarea?

for (int i = 0; i < zom.Count; i++) { Task t = Task.Factory.StartNew(zom[i].Process); t.Wait(); }


Por ejemplo, podría hacer una nueva tarea de la siguiente manera:

try { Task reportTask = Task.Factory.StartNew( () => { Report report = new Report(this._manager); report.ExporterPDF(); } , CancellationToken.None , TaskCreationOptions.None , TaskScheduler.FromCurrentSynchronizationContext() ); reportTask.Wait(); } catch (AggregateException ex) { foreach(var exception in ex.InnerExceptions) { throw ex.InnerException; } }


Una sobrecarga de la respuesta de Servy para comenzar una tarea vacía

public static Task StartSTATask(Action func) { var tcs = new TaskCompletionSource<object>(); var thread = new Thread(() => { try { func(); tcs.SetResult(null); } catch (Exception e) { tcs.SetException(e); } }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); return tcs.Task; }