/// <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(); } }
/// <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(); } }
/// <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); } } }