我有两个C#winform(.NET 4.0)表单,每个表单连续运行单独但相似的自动化任务.它们是不同的流程/工作流程,但它们在项目中共享相同资源(方法,数据模型,程序集等)的操作方式相似.
两种形式都是完整的,但现在我不确定如何运行程序,以便每个窗口在启动时打开并独立运行.部署时,程序将"始终开启".
这可能看起来有点基础,但我的大部分开发经验都是Web应用程序.线程/等对我来说仍然有些陌生.我已经研究过,但我发现的大部分答案都与用户交互和顺序用例有关 - 这只是一个系统连续运行两个不同的进程,需要独立地与世界进行交互.
我发现的潜在解决方案可能涉及多线程,或者某种MDI,或者有些人建议使用DockPanelSuite(尽管处于超级企业环境中,下载第三方文件说起来容易做起来难).
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// Rather than specifying frmOne or frmTwo,
// load both winforms and keep them running.
Application.Run(new frmOne());
}
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个报告工具作为内部 Web 应用程序的一部分。该报告将所有结果显示在一个 GridView 中,我使用 JavaScript 将 GridView 的内容逐行读取到 Excel 对象中。JavaScript 继续在不同的工作表上创建数据透视表。
不幸的是,我没想到如果返回超过几天,GridView 的大小会导致浏览器过载问题。该应用程序每天有几千条记录,假设每月有 6 万条记录,理想情况下我希望能够返回长达一年的所有结果。行数导致浏览器挂起或崩溃。
我们在带有 SQL Server 的 Visual Studio 2010 上使用 ASP.NET 3.5,预期的浏览器是 IE8。该报告由一个 gridview 组成,它根据用户选择的人群从少数存储过程中的一个获取数据。网格视图位于 UpdatePanel 中:
<asp:UpdatePanel ID="update_ResultSet" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btn_Submit" />
</Triggers>
<ContentTemplate>
<asp:Panel ID="pnl_ResultSet" runat="server" Visible="False">
<div runat="server" id="div_ResultSummary">
<p>This Summary Section is Automatically Completed from Code-Behind</p>
</div>
<asp:GridView ID="gv_Results" runat="server"
HeaderStyle-BackColor="LightSkyBlue"
AlternatingRowStyle-BackColor="LightCyan"
Width="100%">
</asp:GridView>
</div>
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)
我对我的团队来说相对较新,所以我遵循了他们将 sproc 返回到 DataTable 并将其用作后面代码中的 DataSource 的典型做法:
List<USP_Report_AreaResult> areaResults = new List<USP_Report_AreaResult>();
areaResults …Run Code Online (Sandbox Code Playgroud) 对于由于其业务逻辑而可能成功完成或失败的方法,哪种返回类型合适?根据该返回类型,适当的命名约定是什么?
我的直觉是 bool 最适合简单的通过/失败。我研究并发现了推断特征的方法的约定- 即 IsValid、HasFoo、ContainsBar 等。但这也是像 BuildHouse() 或 FlyKite() 这样的操作的正确命名,以清楚地指示操作是否成功?
我尝试了几种方法,但每次我都觉得它看起来很奇怪,必须有更好的做法......
bool IsHouseBuilt()
bool TryBuildHouse()
void BuildHouse(out bool success)
PassFailEnum BuildHouse() //seems a little excessive
bool IsKiteFlying()
bool TryFlyKite()
void FlyKite(out bool success)
PassFailEnum FlyKite()
Run Code Online (Sandbox Code Playgroud) 以下方法的目标是异步设置和发布从桌面应用程序到Web控制器的http帖子.我认为我们如何设置下面的任务一定存在问题,我相信.NET 4.5中有更好的实践,例如async/await和Task.Run可以解决问题,但升级目前不是选项.有没有更好的方法来处理/写入.NET 4.0,以防止下面描述的问题?
public void PostWithoutResponse(object objectToPost, string url) {
Task.Factory.StartNew(() =>
{
using (var handler = new HttpClientHandler()) {
handler.PreAuthenticate = true;
handler.Credentials = _credentialPool.GetNetworkCredentials(new Uri(url));
using (var client = new HttpClient(handler)) {
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
using (var stringContent = new StringContent(JsonConvert.SerializeObject(objectToPost), Encoding.UTF8, "application/json")) {
// We weren't able to get this post to work without waiting for result
var result = client.PostAsync(url, stringContent).Result;
}
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
该方法有时只能工作2-3次,有时几次,有时它甚至适用于数百个帖子 - 几个批次 - 在失败之前.程序继续,但数据库中不会反映任何其他帖子,最终会抛出异常.(可能是由于超时.)
我们能够观察到这是抛出的异常:
System.AggregateException was unhandled
Message: An …Run Code Online (Sandbox Code Playgroud) 试图检查linq.js FirstOrDefault()的结果,但检查null或undefined不起作用.在调试它时遇到一些麻烦,但我可以看到它正在返回某种对象.
我找不到任何关于此在线方法的文档.
我试过了:
var value = Enumerable.From(stuff).FirstOrDefault('x => x.Name == "Doesnt exist"')
if (value) {
alert("Should be not found, but still fires");
}
if (value != null)
alert("Should be not found, but still fires");
}
Run Code Online (Sandbox Code Playgroud) c# ×4
javascript ×2
.net-4.0 ×1
asp.net ×1
excel ×1
gridview ×1
http ×1
linq.js ×1
return-value ×1
winforms ×1