相关疑难解决方法(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万
查看次数

什么都不做的异步方法

我有一个IAnimation暴露方法的接口BeginAsync().该方法应该启动动画并在完成时返回.

我想要做的是实现一个只在执行时返回的null动画类.NoAnimationBeginAsync()

这是正确的实施吗?

public async Task BeginAsync()
{
    await Task.Run(() => { });
}
Run Code Online (Sandbox Code Playgroud)

我怀疑有一种比这更优雅的方法.我还考虑过创建一个空方法.但这给了我一个我不喜欢的警告.

.net c# asynchronous task async-await

12
推荐指数
1
解决办法
3922
查看次数

Moq使用没有参数的ReturnsAsync()

我用Moq.我已经嘲笑了一个类似于以下方法的类:

public async Task DoSomething()
{
    // do something...
}
Run Code Online (Sandbox Code Playgroud)

我设置如下:

SomeMock.Setup(x => x.DoSomething())
                .Callback(() => ... ))
                .Returns(Task.FromResult(default(int)));
Run Code Online (Sandbox Code Playgroud)

我不喜欢最后一行:.Returns(Task.FromResult(default(int))).有没有办法以更优雅的方式设置异步返回.我知道有一种方法,ReturnsAsync()但它有一个参数.我的方法返回,Task所以我没有参数ReturnsAsync().

c# unit-testing moq

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

实现异步接口同步

假设我有以下界面:

public interface IApiOutputCache
{
    Task RemoveStartsWithAsync(string key);
    Task<T> Get<T>(string key) where T : class;
    Task RemoveAsync(string key);
    Task<bool> ContainsAsync(string key);
    Task Add(string key, object o, DateTimeOffset expiration, params string[] dependsOnKeys);
    Task<IEnumerable<string>> GetAllKeys();
}
Run Code Online (Sandbox Code Playgroud)

我可以实现不同的缓存提供者.我为两个不同的缓存实现了两次:

a)azure redis b)内存缓存

对于azure redis,这个工作非常好,因为StackExchange.Redis为我提供了所有的异步方法,所以我可以保持完全异步.

现在我为内存缓存实现了另一个,它不为我提供异步api. 现在实现这个界面的最佳实践是什么? 按原样实现,但只是做一切同步?将内部调用变为a Task.Run(我认为快速mem缓存调用不是一个好主意).

.net c# task-parallel-library async-await

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

将async/await转换为Task.ContinueWith

对此问题予以评论引发的这一个:

如何在async/await没有的情况下将非线性代码反向移植到.NET 4.0 Microsoft.Bcl.Async

在链接的问题中,我们有一个WebRequest操作,如果它一直失败,我们想要重试有限次数.该Async/await代码看起来是这样的:

async Task<HttpWebResponse> GetResponseWithRetryAsync(string url, int retries)
{
    if (retries < 0)
        throw new ArgumentOutOfRangeException();

    var request = WebRequest.Create(url);
    while (true)
    {
        WebResponse task = null;
        try
        {
            task = request.GetResponseAsync();
            return (HttpWebResponse)await task;
        }
        catch (Exception ex)
        {
            if (task.IsCanceled)
                throw;

            if (--retries == 0)
                throw; // rethrow last error

            // otherwise, log the error and retry
            Debug.Print("Retrying after error: " + ex.Message);
        }
    }
} …
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous task-parallel-library async-await

6
推荐指数
1
解决办法
3156
查看次数

是否有Task.Delay(0)和Task.FromResult(0)的替代方案?

我正在尝试创建一个利用异步/等待功能集的可移植类库(.NET 4.5/Silverlight 5/Win Phone 8/WinRT).我发现我需要包含Microsoft.Bcl.AsyncNuGet包才能使这个功能正常工作,所以我做到了这一点.显然由于我的目标,我无法访问Task.Delay(0)Task.FromResult(0).我想知道下一个最好的选择是什么?

目前,我正在使用:( new Task(() => { })基本上,一个不执行任何操作的任务.)

我不确定这是否与前面提到的模式中的任何一个最佳等效.


更新:显然我是盲目的,并没有TaskEx在我的intellisense菜单中看到.我打开这个问题所以人们知道它就在那里,只是因为我的intellisense自动完成而容易错过TaskExtensions.

.net c# base-class-library async-await portable-class-library

4
推荐指数
1
解决办法
3360
查看次数

如何创建可取消的任务循环?

是否可以使用System.Threading.Task.Task创建可以取消的任务循环?

流程应以Task.Delay(x ms)开始,然后继续使用用户定义的任务,然后是另一个Task.Delay(y ms),并从用户定义的任务开始重复.

var result = Task.Delay(initialDelay)
              .ContinueWith(t => dostuff..)
              .ContinueWith what goes here?
Run Code Online (Sandbox Code Playgroud)

甚至可以使用任务吗?

我可以启动一个计时器并完成它,但如果我需要取消,使用任务似乎是正确的方法,不是吗?

c# task-parallel-library

4
推荐指数
1
解决办法
1177
查看次数