小编swe*_*ner的帖子

Redis服务器重启后,服务堆栈Redis重新连接

我们使用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上设置超时但是没有帮助,我猜是因为超时是在服务器端强制执行的.

这种类型的容错是否构建在服务堆栈中,我们错过了它?

或者是我们的实现应该处理的东西?如果有,是否有任何推荐的方法?

fault-tolerance redis servicestack

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

模拟异步方法

我们正在使用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)

c# moq task async-await taskcompletionsource

5
推荐指数
1
解决办法
3216
查看次数

Fody Async MethodDecorator处理异常

我试图使用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)

c# il asynchronous fody

5
推荐指数
1
解决办法
1321
查看次数