gpt4 book ai didi

c# - 如何强制 Task.Factory.StartNew 进入后台线程?

转载 作者:可可西里 更新时间:2023-11-01 08:04:07 25 4
gpt4 key购买 nike

我已经看到许多其他类似的问题,但没有在那里找到我的答案。

我的问题是我正在使用以下流程创建线程:

private void btn_Click(object sender, EventArgs e)
{
service.GetCount(
(count, ex) =>
{
if (ex != null)
return;

for (int i = 0; i < count; i++)
{
service.Get(onItemReceived, i);
}
}
);
}

public void GetCount(Action<int, Exception> callback)
{
var callingThread = TaskScheduler.FromCurrentSynchronizationContext();

Func<int> action = () =>
{
return client.GetCount(); // Synchronous method, could take a long time
};

Action<Task<int>> completeAction = (task) =>
{
Exception ex = (task.Exception != null) ? task.Exception.InnerException : task.Exception;

if (callback != null)
callback(task.Result, ex);
};

Task.Factory.StartNew(action).ContinueWith(completeAction, callingThread);
}

public void Get(Action<object, Exception> callback, int index)
{
var callingThread = TaskScheduler.FromCurrentSynchronizationContext();

Func<object> action = () =>
{
return client.Get(index); // Synchronous method, could take a long time
};

Action<Task<object>> completeAction = (task) =>
{
Exception ex = (task.Exception != null) ? task.Exception.InnerException : task.Exception;

if (callback != null)
callback(task.Result, ex);
};

Task.Factory.StartNew(action).ContinueWith(completeAction, callingThread);
}

这样,我服务的每个异步方法都会回调它们最初调用的线程(通常是 UI 线程)。所以我正在模拟 await/async 关键字的工作方式(我不能使用 .NET 4.5)。

此模式的问题在于,在第一次调用“ContinueWith”后,我会莫名其妙地锁定到 UI 线程。因此,在这种情况下,如果我尝试为每个进程生成 5 个线程来处理一个同步函数 Get,它们将一个接一个地执行而不是并行执行,并且在这样做时它们将阻塞 UI 线程,即使我尝试指定 TaskCreationOptions.LongRunning。

我第一次调用 Task.Factory.StartNew 时从未发生过这种情况,它只会发生在第一次回调中的后续调用中。

最佳答案

为了强制启动新线程,您应该在调用 Task.Factory.StartNew 时指定 TaskScheduler.Default,如下所示:

Task.Factory.StartNew(action,
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default).ContinueWith(completeAction);

在我的测试中,您不需要指定 TaskCreationOptions.LongRunning 来强制后台线程,尽管它不会造成伤害。

关于c# - 如何强制 Task.Factory.StartNew 进入后台线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com