我需要一种方法来设置异步任务,因为长时间运行而不使用Task.Factory.StartNew(...)而是使用Task.Run(...)或类似的东西.
语境:
我有连续循环的任务,直到它被外部取消,我想设置为'长时间运行'(即给它一个专用的线程).这可以通过以下代码实现:
var cts = new CancellationTokenSource();
Task t = Task.Factory.StartNew(
async () => {
while (true)
{
cts.Token.ThrowIfCancellationRequested();
try
{
"Running...".Dump();
await Task.Delay(500, cts.Token);
}
catch (TaskCanceledException ex) { }
} }, cts.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
Run Code Online (Sandbox Code Playgroud)
问题是Task.Factory.StartNew(...)不返回传入的活动异步任务,而是返回"运行Action的任务",其功能上始终具有taskTatus的'RanToCompletion'.由于我的代码需要能够跟踪任务的状态以查看它何时变为"已取消"(或"故障"),我需要使用以下内容:
var cts = new CancellationTokenSource();
Task t = Task.Run(
async () => {
while (true)
{
cts.Token.ThrowIfCancellationRequested();
try
{
"Running...".Dump();
await Task.Delay(500, cts.Token);
}
catch (TaskCanceledException ex) { }
} }, cts.Token);
Run Code Online (Sandbox Code Playgroud)
Task.Run(...),根据需要,返回异步过程本身,允许我获得'已取消'或'故障'的实际状态.但是,我无法将任务指定为长时间运行.那么,任何人都知道如何最好地运行异步任务,同时存储该活动任务本身(使用所需的taskStatus)并将任务设置为长时间运行?