我们使用Service Stack的RedisClient的BlockingDequeue来保存一些数据,直到它可以被处理.调用代码看起来像
using (var client = ClientPool.GetClient())
return client.As<TMessage>().Lists[_channel].BlockingDequeue(timeout);
Run Code Online (Sandbox Code Playgroud)
如果重新启动托管Redis的服务器,则BlockingDequeue的连接将变为僵尸,并且在重新启动客户端应用程序之前永远不会返回.
我们已经尝试在BlockingDequeue和PooledConnectionManager上设置超时但是没有帮助,我猜是因为超时是在服务器端强制执行的.
这种类型的容错是否构建在服务堆栈中,我们错过了它?
或者是我们的实现应该处理的东西?如果有,是否有任何推荐的方法?
我们正在使用MSTest和Moq编写异步代码的单元测试.
所以我们有一些看起来像这样的代码:
var moq = new Mock<Foo>();
moq.Setup(m => m.GetAsync())
.Returns(Task.FromResult(10));
Run Code Online (Sandbox Code Playgroud)
或者像具有更新版Moq的项目一样
var moq = new Mock<Foo>();
moq.Setup(m => m.GetAsync())
.ReturnsAsync(10);
Run Code Online (Sandbox Code Playgroud)
查看ReturnsAsync的Moq实现:
public static IReturnsResult<TMock> ReturnsAsync<TMock, TResult>(this IReturns<TMock, Task<TResult>> mock, TResult value) where TMock : class
{
TaskCompletionSource<TResult> completionSource = new TaskCompletionSource<TResult>();
completionSource.SetResult(value);
return mock.Returns(completionSource.Task);
}
Run Code Online (Sandbox Code Playgroud)
这两种方法在引擎盖下看起来都是一样的.两者都创建TaskCompletionSource,调用SetResult并返回Task
到现在为止还挺好.
但是,短期运行async方法已经过优化,可以同步运行.这似乎意味着它TaskCompletionSource始终是同步的,这似乎也表明上下文处理和任何可能发生的相关问题永远不会发生.
因此,如果我们有一些代码正在做一些async禁忌,比如混合awaits,Wait()并且Result在单元测试中不会检测到这些问题.
创建一个总能产生控制权的扩展方法会有什么好处吗?就像是 :
public async Task<T> ReturnsYieldingAsync<T>(T result)
{
await Task.Yield();
return result;
} …Run Code Online (Sandbox Code Playgroud) 我试图使用Fody来包装从具有常见异常格式的方法抛出的所有异常.
所以我添加了所需的接口声明和类实现,如下所示:
using System;
using System.Diagnostics;
using System.Reflection;
using System.Threading.Tasks;
[module: MethodDecorator]
public interface IMethodDecorator
{
void Init(object instance, MethodBase method, object[] args);
void OnEntry();
void OnExit();
void OnException(Exception exception);
void OnTaskContinuation(Task t);
}
[AttributeUsage(
AttributeTargets.Module |
AttributeTargets.Method |
AttributeTargets.Assembly |
AttributeTargets.Constructor, AllowMultiple = true)]
public class MethodDecorator : Attribute, IMethodDecorator
{
public virtual void Init(object instance, MethodBase method, object[] args) { }
public void OnEntry()
{
Debug.WriteLine("base on entry");
}
public virtual void OnException(Exception exception)
{
Debug.WriteLine("base on exception"); …Run Code Online (Sandbox Code Playgroud)