我正在尝试在我正在开发的应用程序中使用.NET Backgroundworker对象.
互联网上的所有资料都说这个对象在"背景"中运行,但我无法确认这个后台线程确实以"低优先级"模式运行.出现这个问题是因为在Windows中(我假设)后台任务可以在"正常"或"低于正常"或"低"优先级模式下运行.
在我的应用程序中,我尝试通过调用...在DoWork函数内设置优先级...
Thread.CurrentThread.Priority=ThreadPriority.Lowest
Run Code Online (Sandbox Code Playgroud)
...
但这似乎没有效果.后台工作者是否忽略此调用?
我想解释一下:
我的应用程序是一个互联网客户端,从一个房间收集有关温度,湿度等的实时数据,并使用上传到网页(不是网络服务)
system.net.webclient.UploadValuesAsync(...) 电话
我编写了应用程序,以便客户端GUI收集来自分庭的数据,给它们加上时间戳,然后将它们排队等待上传,就像这样
...
Synclock objlock
debug.print("Queueing reading...")
dataQ.Enque(reading)
End Synclock
...
Run Code Online (Sandbox Code Playgroud)
backgroundworker的Dowork函数出列然后上传,就像这样......
..............
Do
if dataQ.count() <> 0 then
Synclock objlock
reading = dataQ.DeQue()
End Synclock
Dim client As New System.Net.WebClient
...put the reading in NameValueCollection and upload to server page
req = new NameValueCollection
...
...
client.UploadValuesAsync(uri, "POST", req)
endif
thread.sleep(1) 'without this line the CPU usage goes upto 100% and seems to slow other tasks!
Loop …Run Code Online (Sandbox Code Playgroud) 当某个后台工作人员忙碌(工作)时,我不希望用户与我的应用程序进行交互.我创建了这个bgw,以便应用程序在工作时看起来不会冻结.但现在用户可以在应用程序中移动.如何禁用我的表单/应用程序?
谢谢!
我有一个在后台工作中运行的任务.单击开始按钮用户启动该过程并有一个取消按钮取消处理.
当用户点击取消时,我想显示一个消息框"进程尚未完成,是否要继续".
在这里,我希望只有在用户输入后才能进行处理.然后,然后想要停止背景线程.谁可以帮我这个事.反正有没有停止背景工作者一段时间.任何一种帮助将不胜感激.
是否有一种简单的方法可以在iOS开箱后的特定延迟后执行方法?
在iPhone上我会这样做:
[self performSelector:@selector(connectSensor) withObject:nil afterDelay:2.5];
然后,它将connectSensor在2.5秒后执行主线程(UI线程)上的方法.并且因为它是在主线程上自动调度的,所以您不必担心跨线程问题.(还有一个performSelectorOnBackground版本)
那么我如何在WP7中正确地做到这一点?
目前我正在用计时器完成这项工作,但我不确定这是否是一个很好的解决方案.
private Timer timer;
private void DoSomethingAfterDaly()
{
// ... do something here
timer = new Timer( (o) => Deployment.Current.Dispatcher.BeginInvoke(() => NavigationService.GoBack()), null, 2500, Timeout.Infinite);
}
Run Code Online (Sandbox Code Playgroud)
如何将其封装到扩展方法中,以便我可以调用this.Perform(MyMethod, null, 2500);?
这个senerio有效吗?
我有一个View来维护一个Item.
我有View Model,它将Item对象(实现INotifyPropertyChanged)公开为View绑定的Property.
将Item对象传递给修改它的Backgroundworker是否有效,然后在BackgroundWorking完成时引发PropertyChanged事件?
或者BackgroundWorker不应该修改Item对象.我将使用BackgroundWorker传回的结果更新现有的Item对象.这将在RunWorkerCompleted事件中完成.但这会锁定UI线程并击败拥有背景工作者的对象吗?
困惑?
我会试着解释一下.
用户可以选择创建项目.我创建了视图和视图模型.在View模型中,创建一个空Item对象.他被提供了一个视图来维护项目.在选择"项类型"属性时,这会启动一个复杂的过程来创建用户输入的权限列表.我可以在创建列表时阻止UI线程,但这会给用户带来糟糕的体验.我想将处理传递给后台线程,同时保持UI活着.目前,我设置了一个标志来指示View正在加载的部分,将Item对象传递给BackgroundWorker,后者更新了可观察的Properties集合.当BackgroundWorking完成后,我调用PropertyChanged事件,该事件更新绑定到列表的View部分,并关闭该标志以指示该部分正在加载.这似乎没有任何问题.但我有一种直觉,我不应该在后台线程中更新视图模型中的绑定项.
谢谢蒂姆
我正在创建不在我的Windows窗体中的后台工作程序,而是在实现所有处理的类文件(BusinessLogic)中.从主窗体我首先调用初始化BGW的BL方法.然后我调用BL的方法来启动BGW.
这是我的实现更多背景:). 如何在类文件中使用BackGroundWorker?
DoWork事件运行正常,但它不会调用RunWorkerCompleted.
一些谷歌搜索,我发现了这个链接.我觉得我的问题与这些家伙一样. http://www.eggheadcafe.com/software/aspnet/29191764/backgroundworker-does-not-fire-the-runworkercompleted-event.aspx
我对此问题的任何意见表示感谢.提前致谢.
主要代码:
private void frmMain_Load(object sender, EventArgs e)
{
Hide();
BusinessLogic.BGWInitialize();
BusinessLogic.StartBackgroundWorker();
while (!BusinessLogic.firstCycleDone)
{
Thread.Sleep(100);
}
Show();
}
Run Code Online (Sandbox Code Playgroud)
BusinessLogic中的代码:
public static void BGWInitialize()
{
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged);
bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
bgWorker.WorkerReportsProgress = true;
}
public static void StartBackgroundWorker()
{
bgWorker.RunWorkerAsync();
}
private static void bgWorker_RunWorkerCompleted(
object sender, RunWorkerCompletedEventArgs e)
{
firstCycleDone = true;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Heroku + RedisToGo + Resque.我有一个正在运行非结束任务的工人.我想要记录它的活动.heroku logs --tail没有显示有关工人活动的任何信息.我怎样才能做到这一点?谢谢!
我有一个WinForms应用程序,我的后台工作人员正在执行同步任务,添加新文件,删除旧文件等.
在我的后台工作者代码中,我想向用户显示一个自定义表单,告诉他将删除什么以及如果他继续将添加什么,使用YES/NO按钮获取他的反馈.
我想知道在后台工作者的doWork方法中做这样的事情是否可行?如果没有,我该怎么办?
请指教..
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
MyForm f = new MyForm();
f.FilesToAddDelete(..);
DialogResult result = f.ShowDialog();
if(No...)
return;
else
//keep working...
}
Run Code Online (Sandbox Code Playgroud) 我有"谷歌搜索"但仍然与任务,线程和后台工作者混淆.....
"任务是在当前线程上运行的高级API"是否正确?
如果1是正确的,为什么我需要使用invoke来更改同一线程中任务内的UI?
Backgroundworker在应用程序中只获得最低优先级?那么backgroundworker的性能低于任务和线程?对 ?
最后,在我的应用程序中,我需要使用"HttpWebRequest"从服务器获取一个字符串,之后解析字符串并更新UI.如果我使用"HttpWebRequest.BeginGetResponse"来等待异步结果并触发一个完整的事件来更新UI,我需要使用invoke方法来调用UI线程控件,但是我可以使用后台工作器代替吗?我可以简单地在"RunWorkerCompleted"事件中更改UI,有什么不利之处吗?
对不起我的游泳池英语并感谢您的帮助......!
或者问题的另一个方面是:我是否应该在编写后台工作人员时处理表单被关闭的可能性?
例如,我有一个代码,它在后台工作程序中执行SQL查询(不可取消),然后在日历控件中完成"加粗"日期以匹配查询返回的日期.
我很好奇背景工作者在这种情况下的目的是什么?- 不要开火RunWorkerComplete吗?- 忽略RunWorkerComplete函数调用中对话框的调用,因为它不再是一个窗口了?