// 2017/6/16 void m_loader_Prompt(object sender, MessagePromptEventArgs e) { MessagePromptEventHandler handler = this.Prompt; if (handler != null) { handler(sender, e); } }
// static CancellationToken _token; // 探测 MD5 (用轮询任务法) // return: // -1 出错 // 0 文件没有找到 // 1 文件找到 public static int GetServerFileMD5ByTask( LibraryChannel channel, Stop stop, string strServerPath, MessagePromptEventHandler prompt, CancellationToken token, out byte[] md5, out string strError) { strError = ""; md5 = null; // 对于 dp2Kernel 内的资源只能用以前的非 Task 方式 if (strServerPath.StartsWith("!") == false) { return(GetServerFileMD5_old( channel, stop, strServerPath, out md5, out strError)); } /* * string strStyle = "md5"; * string strMetadata = ""; * byte[] baContent = null; * string strOutputPath = ""; */ TimeSpan old_timeout = channel.Timeout; channel.Timeout = TimeSpan.FromSeconds(10); try { // 检查 dp2library 版本号 REDO_GETVERSION: long lRet = channel.GetVersion(stop, out string version, out string uid, out strError); if (lRet == -1) { if (prompt != null && !(stop != null && stop.IsStopped == true)) { MessagePromptEventArgs e = new MessagePromptEventArgs(); e.MessageText = $"获得 dp2library 服务器 {channel.Url} 版本号时发生错误: {strError}"; e.Actions = "yes,no,cancel"; prompt(null, e); if (e.ResultAction == "yes") { goto REDO_GETVERSION; } } strError = "检查 dp2library 服务器版本号时出错: " + strError; return(-1); } string base_version = "3.23"; if (StringUtil.CompareVersion(version, base_version) < 0) { // strError = "获得服务器文件 MD5 的功能需要 dp2library 服务器版本为 {base_version} 以上"; // return -1; // 改用旧功能 return(GetServerFileMD5_old( channel, stop, strServerPath, out md5, out strError)); } // TODO: 如果此请求出现通讯错误,再次重试请求的时候记得 removeTask 前一次的 task // 启动任务 // return: // strStyle 一般设置为"content,data,metadata,timestamp,outputpath"; // -1 出错。具体出错原因在this.ErrorCode中。this.ErrorInfo中有出错信息。 // 0 成功 lRet = channel.GetRes( stop, strServerPath, 0, 0, "md5,beginTask", out byte[] baContent, out string strMetadata, out string strOutputPath, out md5, out strError); if (lRet == -1) { if (channel.ErrorCode == localhost.ErrorCode.NotFound) { return(0); } // TODO: 遇到通讯出错,需要重试操作 return(-1); } string taskID = Encoding.UTF8.GetString(md5); // 轮询,获得任务结果 while (true) { if (token.IsCancellationRequested) { strError = "前端请求中断"; return(-1); } if (stop != null && stop.IsStopped) { strError = "前端请求中断"; return(-1); } REDO_CHECKTASK: lRet = channel.GetRes( stop, strServerPath, 0, 0, $"md5,getTaskResult,taskID:{taskID}", out baContent, out strMetadata, out strOutputPath, out md5, out strError); // TODO: 如果遇到通讯出错,需要重试操作 if (lRet == -1) { if (prompt != null && !(stop != null && stop.IsStopped == true)) { MessagePromptEventArgs e = new MessagePromptEventArgs(); e.MessageText = $"检查文件 {strServerPath} MD5 任务状态时发生错误: {strError}"; e.Actions = "yes,no,cancel"; prompt(null, e); if (e.ResultAction == "yes") { goto REDO_CHECKTASK; } } return(-1); } if (lRet == 1) { return(1); } Task.Delay(TimeSpan.FromSeconds(1), token).Wait(); } } catch (Exception ex) { strError = "GetServerFileMD5ByTask() 出现异常: " + ex.Message; return(-1); } finally { channel.Timeout = old_timeout; } }