Exemplo n.º 1
0
 /// <summary>
 /// 区块排它锁,带返回值。
 /// </summary>
 /// <param name="action">进入锁之后的回调。</param>
 public T Block <T>(BlockFunc <T> action)
 {
     Symbol.CommonException.CheckArgumentNull(action, "action");
     Begin();
     try {
         return(ThreadHelper.Block <T>(_sync, action));
     } finally {
         End();
     }
 }
Exemplo n.º 2
0
 /// <summary>
 /// 区块排它锁,带返回值。
 /// </summary>
 /// <param name="action">进入锁之后的回调。</param>
 /// <param name="arg">参数。</param>
 public TResult Block <TArg, TResult>(BlockFunc <TArg, TResult> action, TArg arg)
 {
     Symbol.CommonException.CheckArgumentNull(action, "action");
     Begin();
     try {
         return(ThreadHelper.Block(_sync, action, arg));
     } finally {
         End();
     }
 }
Exemplo n.º 3
0
    /// <summary>
    /// 区块排它锁,带返回值。
    /// </summary>
    /// <param name="state">用于排它锁的对象,不能是结构类型和string。</param>
    /// <param name="action">进入锁之后的回调。</param>
    /// <param name="arg">参数。</param>
    public static TResult Block <TArg, TResult>(object state, BlockFunc <TArg, TResult> action, TArg arg)
    {
        Symbol.CommonException.CheckArgumentNull(state, "state");
        Symbol.CommonException.CheckArgumentNull(action, "action");
        bool lockToken = false;

#if net20 || net35
        System.Threading.Monitor.Enter(state);
        lockToken = true;
#else
        System.Threading.Monitor.Enter(state, ref lockToken);
#endif
        try {
            TResult result = action(arg);
            return(result);
        } finally {
            if (lockToken)
            {
                System.Threading.Monitor.Exit(state);
            }
        }
    }