我试图在任务上设置公寓状态但是看不到这样做的选项.有没有办法使用任务执行此操作?
for (int i = 0; i < zom.Count; i++)
{
Task t = Task.Factory.StartNew(zom[i].Process);
t.Wait();
}
Run Code Online (Sandbox Code Playgroud)
Ser*_*rvy 89
如果StartNew失败,你只是做自己:
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;
}
Run Code Online (Sandbox Code Playgroud)
(你可以为Task它创建一个看起来几乎相同的,或为某些各种选项添加重载StartNew.)
Dav*_*vid 15
Servy的一个重载是开始一个无效任务的答案
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;
}
Run Code Online (Sandbox Code Playgroud)
小智 13
例如,您可以按如下方式创建新任务:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Task这是构造函数和方法的一个很好的用例RunSynchronously。
public static Task<T> RunSTATask<T>(Func<T> function)
{
Task<T> task = new(function, TaskCreationOptions.DenyChildAttach);
Thread thread = new(() => task.RunSynchronously());
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return task;
}
Run Code Online (Sandbox Code Playgroud)
的目的TaskCreationOptions.DenyChildAttach是使结果任务的行为与 Servy 的解决方案TaskCompletionSource.Task相同(不可能将子任务附加到父任务)。拒绝孩子依恋也是Task.Run方法的行为。
| 归档时间: |
|
| 查看次数: |
30424 次 |
| 最近记录: |