我正在实现一个方法,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)
有更好的解决方案吗?
我有一个IAnimation
暴露方法的接口BeginAsync()
.该方法应该启动动画并在完成时返回.
我想要做的是实现一个只在执行时返回的null
动画类.NoAnimation
BeginAsync()
这是正确的实施吗?
public async Task BeginAsync()
{
await Task.Run(() => { });
}
Run Code Online (Sandbox Code Playgroud)
我怀疑有一种比这更优雅的方法.我还考虑过创建一个空方法.但这给了我一个我不喜欢的警告.
我用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()
.
假设我有以下界面:
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缓存调用不是一个好主意).
对此问题予以评论引发的这一个:
如何在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 4.5/Silverlight 5/Win Phone 8/WinRT).我发现我需要包含Microsoft.Bcl.Async
NuGet包才能使这个功能正常工作,所以我做到了这一点.显然由于我的目标,我无法访问Task.Delay(0)
或Task.FromResult(0)
.我想知道下一个最好的选择是什么?
目前,我正在使用:( new Task(() => { })
基本上,一个不执行任何操作的任务.)
我不确定这是否与前面提到的模式中的任何一个最佳等效.
更新:显然我是盲目的,并没有TaskEx
在我的intellisense菜单中看到.我打开这个问题所以人们知道它就在那里,只是因为我的intellisense自动完成而容易错过TaskExtensions
.
.net c# base-class-library async-await portable-class-library
是否可以使用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)
甚至可以使用任务吗?
我可以启动一个计时器并完成它,但如果我需要取消,使用任务似乎是正确的方法,不是吗?