/// <summary> /// 异步执行并返回 /// </summary> /// <param name="key"></param> /// <param name="msg"></param> /// <returns></returns> public void PushDelayRun(string key, string msg, string cmd, int delayMinute) { if (string.IsNullOrEmpty(cmd)) { cmd = key; } var time = DateTime.Now.AddMinutes(delayMinute); var sencond = time.Second / 10 * 10; var timeKey = time.ToString("yyyyMMddHHmm") + sencond; var innerMsg = new PushMsg { Key = key, Command = cmd, Body = msg, Time = DateTime.Now, IsBack = false }; Exec(db => { db.ListLeftPush(FormatKey(MsgQuoteDelayCommonChannel(timeKey)), innerMsg.ToJson()); }, 2); }
/// <summary> /// 异步执行并返回 /// </summary> /// <param name="key"></param> /// <param name="msg"></param> /// <returns></returns> public Task <ServiceResult <string> > PushRun(string key, string msg, string cmd, bool isBack = false) { if (string.IsNullOrEmpty(cmd)) { cmd = key; } var innerMsg = new PushMsg { Key = Guid.NewGuid().ToString(), Command = cmd, Body = msg, Time = DateTime.Now, IsBack = isBack }; var ts = new TaskCompletionSource <ServiceResult <string> >(); try { Exec(db => { db.ListLeftPush(FormatKey(key), innerMsg.ToJson()); if (isBack) { var searchLoop = 0; var backKey = FormatKey($"System:AsyncExcutor_Back:{innerMsg.Key}"); while (searchLoop < 100) { if (db.KeyExists(backKey)) { var rstMsg = (string)db.StringGet(backKey); Logger?.Write($"excutor msg rst:{rstMsg}"); Console.WriteLine(rstMsg); ts.SetResult(rstMsg.ToObject <ServiceResult <string> >()); db.KeyDelete(backKey); break; } else { searchLoop++; Thread.Sleep(100); } } if (searchLoop >= 100) { Console.WriteLine("timer out"); ts.SetException(new TimeoutException()); } } else { ts.SetResult(new ServiceResult <string>(ExecutResultCode.Success)); } }, 2); } catch (Exception ex) { ts.SetException(ex); } return(ts.Task); }