我有一个有很多长方法的表单.我的任务是:最佳做法是什么?使用匿名方法和只有一个backgroundworker或为每个long方法创建BackgroundWorker实例.
请帮忙.谢谢.
我想为WinForm创建一个后台工作程序,每当午夜滚动时触发代码.
我知道如何做到这一点,但我很确定这不是最好的方法.
while(1==1)
{
//if Datetime.Now == midnight, execute code
//sleep(1second)
}
Run Code Online (Sandbox Code Playgroud) 我通常在C#中编写Windows服务,但我在F#中使用它.对于像这样的轮询服务,我通常使用我写的类,类似于BackgroundWorker.它产生一个后台线程并定期触发OnWork方法.(完整代码在这里[github].)
在F#中有另一种,或许更好或更惯用的方法吗?它可能是编写轮询后台工作者类或内置替代方法的更好方法.
根据乔尔的建议,这就是我提出的问题.
module Async =
open System.Diagnostics
let poll interval work =
let sw = Stopwatch()
let rec loop() =
async {
sw.Restart()
work()
sw.Stop()
let elapsed = int sw.ElapsedMilliseconds
if elapsed < interval then
do! Async.Sleep(interval - elapsed)
return! loop()
}
loop()
//Example
open System.Threading
let cts = new CancellationTokenSource()
Async.Start(Async.poll 2000 (fun () -> printfn "%A" DateTime.Now), cts.Token)
Thread.Sleep(TimeSpan.FromSeconds(10.0))
cts.Cancel()
Run Code Online (Sandbox Code Playgroud)
该服务使用poll:
type MyService() =
inherit System.ServiceProcess.ServiceBase()
let …Run Code Online (Sandbox Code Playgroud) 这应该是一件相当简单的事情; 但是,我一直无法弄清楚这一点.
/// This section is located in the InitializeComponent() method
/// form's class, i.e. partial class frmMain { .... }
this.bgw = new System.ComponentModel.BackgroundWorker();
this.bgw.WorkerReportsProgress = true;
this.bgw.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgw_DoWork);
this.bgw.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgw_ProgressChanged);
/// This code is located in public partial class frmMain : Form { .... }
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
Thread.Sleep(100); // Wait 100 milliseconds
//Console.WriteLine(i);
bgw.ReportProgress(i);
}
}
private void bgw_ProgressChanged(object …Run Code Online (Sandbox Code Playgroud) 我试图找出一种方法来验证BackgroundWorker线程是否存活(即仍在运行.该线程基本上是作为一个简单的无限循环实现的:
while (AllConditionsMet())
{
DoSomeMagic();
Thread.Sleep(10000);
}
Run Code Online (Sandbox Code Playgroud)
IsAlive()到目前为止我发现的最接近的是IsBusy属性,但考虑到我的线程Sleep()大部分时间,我不确定这是否能完成这项工作.
我可以依靠IsBusy来做:
if (!myWorker.IsBusy)
RestartWorker();
Run Code Online (Sandbox Code Playgroud)
还是我在招惹麻烦?
或者问题的另一个方面是:我是否应该在编写后台工作人员时处理表单被关闭的可能性?
例如,我有一个代码,它在后台工作程序中执行SQL查询(不可取消),然后在日历控件中完成"加粗"日期以匹配查询返回的日期.
我很好奇背景工作者在这种情况下的目的是什么?- 不要开火RunWorkerComplete吗?- 忽略RunWorkerComplete函数调用中对话框的调用,因为它不再是一个窗口了?
我遇到了一个我不确定如何解决的问题.我有一个方法,其中包含来自填充数据表的服务的调用,例如:
private void GetCases()
{
try
{
//Setup our criteria
Web_search_criteria myCriteria = new Web_search_criteria()
{
Keynum = 9, //Use Opening Date Key
Range_start = "20100101", //01-01-2010
Range_end = "20121223" //12-23-2013
};
//The myCases object is a datatable that is populated from the GetCasesDT() call.
int status = db.server.GetCasesDT(myCriteria, ref myCases);
}
catch (Exception ex)
{
XtraMessageBox.Show("Unable to get data: " + ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
所以,正如你所看到的,我没有办法一次抓住几个案例 - 它只是抓住了一切.
现在,我在BackgroundWorker的DoWork事件中调用了这个方法,并在其上显示另一个带有选取框进度条的表单,以便用户知道系统实际上正在执行某些操作.在那个表单上,我有一个我订阅的取消按钮.这是执行此操作的代码:
backgroundWorker1 = new BackgroundWorker()
{
WorkerSupportsCancellation = true,
WorkerReportsProgress = true …Run Code Online (Sandbox Code Playgroud) 我每分钟都在使用node-cron做一些繁重的任务(更新数据库)。这个任务是使用主进程来工作还是 nodejs 会创建一些工人来完成这些任务?
var CronJob = require('cron').CronJob;
new CronJob('0 * * * * *', function() {
//Update database every minute here
console.log('Update database every minute');
}, null, true, 'America/Los_Angeles');
Run Code Online (Sandbox Code Playgroud)