相关疑难解决方法(0)

创建一个已完成的任务<T>

我正在实现一个方法,Task<Result> StartSomeTask()并且在调用方法之前就已经知道了结果.如何创建已完成的Task <T>?

这就是我目前正在做的事情:

private readonly Result theResult = new Result();

public override Task<Result> StartSomeTask()
{
    var task = new Task<Result>(() => theResult);
    task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
    return task;
}
Run Code Online (Sandbox Code Playgroud)

有更好的解决方案吗?

.net c# task-parallel-library

118
推荐指数
3
解决办法
4万
查看次数

Task.Delay(0)不是异步的

我有以下代码(是的,我可以模拟JavaScript setTimeoutAPI)

    async void setTimeout(dynamic callback, int timeout)
    {
        await Task.Delay(timeout);
        callback();
    }
Run Code Online (Sandbox Code Playgroud)

它看起来像timeout > 0,在setTimeout异步其中,控制返回到作品callee上await,并callback在任务完成后调用异步运行.但是,当timeout == 0函数以同步方式运行时(代码总是在没有上下文切换的同一线程中经过await行).在进一步挖掘时,事实证明这Task.Delay是以这种方式实现的(Task.Yield()与Task.Delay(0))

不知道是否有一种方法,使Task.Delay(0)或异步的替代解决方案,使我的setTimeout功能异步时timeout是0?(这样我可以模仿JavaScript setTimeout 功能)我看到有关使用Task.FromResult(true)或的讨论Task.WhenAll,但它们似乎不起作用.

事实上,我可以使用Task.Delay(1)而Task.Delay(0)不是看起来有机.

c# multithreading asynchronous async-await

9
推荐指数
1
解决办法
4018
查看次数

异步方法阻塞在未等待的任务上

在我当前的项目中,我有一段代码,在将其简化为我遇到问题的地方后,它看起来像这样:

private async Task RunAsync(CancellationToken cancel)
{
    bool finished = false;
    while (!cancel.IsCancellationRequested && !finished)
        finished = await FakeTask();
}

private Task<bool> FakeTask()
{
    return Task.FromResult(false);
}
Run Code Online (Sandbox Code Playgroud)

如果我不等待就使用此代码,无论如何我最终都会阻塞:

// example 1
var task = RunAsync(cancel); // Code blocks here...
... // Other code that could run while RunAsync is doing its thing, but is forced to wait
await task;

// example 2
var task = RunAsync(cancelSource.Token); // Code blocks here...
cancelSource.Cancel(); // Never called
Run Code Online (Sandbox Code Playgroud)

在实际项目中,我实际上并没有使用 FakeTask,通常会有一些 Task.Delay 在那里等待,所以大部分时间代码实际上并没有阻塞,或者只是有限的迭代次数.

然而,在单元测试中,我使用了一个模拟对象,它几乎可以完成 FakeTask …

.net c# asynchronous async-await

1
推荐指数
2
解决办法
588
查看次数