我有一个应用程序,它会ping本地子网上的每个可能的IP,以便编译响应的IP地址列表.目前,它一次ping所有255个.是否可以通过一次ping多个线程来转换此应用程序以使用多个线程来提高速度?我是多线程概念的新手,并认为这是一个很好的学习方法(只要当然可能).
此外,您可以教育我的任何风格改进也会有所帮助.
提前谢谢
这是backgroundWorker1_DoWork事件中的当前ping方法.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
count = 0;
for (int i = 1; i < 255; i++)
{
Ping ping = new Ping();
PingReply pingreply = ping.Send(IPAddress.Parse(locip[0] + "." + locip[1] + "." + locip[2] + "." + i));
count += 1;
if (pingreply.Status == IPStatus.Success)
{
status = "o";
repAddress = pingreply.Address.ToString(); ;
repRoundtrip = pingreply.RoundtripTime.ToString();
repTTL = pingreply.Options.Ttl.ToString();
repBuffer = pingreply.Buffer.Length.ToString();
string[] lineBuffer = { status, repAddress, repRoundtrip, repTTL, repBuffer };
ipList.Rows.Add(lineBuffer); …Run Code Online (Sandbox Code Playgroud) 与TWAIN通信的哪些部分可以放入另一个线程,例如BackgroundWorker?或者:是否可以拆分处理图像传输的循环?
某些扫描仪驱动程序会在返回调用应用程序之前扫描所有图像,这会强制应用程序立即处理所有图像.这导致例如OutOfMemoryException或我的WPF应用程序中的奇怪行为,当突然所有事件(在每个扫描图像之后引发)必须立即处理.此外,应用程序会挂起,直到传输完成.
我正在使用TwainDotNet:http://code.google.com/p/twaindotnet/但我也在寻找一个通用的解决方案,描述消息过滤器以及与TWAIN独立的TwainDotNet的交互.包含TWAIN消息的工作流程就足够了.其他语言也很受欢迎,比较喜欢C或Deplhi.
DataSourceManager中消息过滤器的当前实现可以描述如下:
我用几台扫描仪测试了这个:
我不关心显示问题,而是关注被阻止的窗口和内存问题.将将图像传输到BackgroundWorker的循环导致几次崩溃,我无法调试.因为我考虑了WPF的线程问题.我也不知道如何拆分传输循环,这样,在传输一个图像后,程序返回到消息过滤器,消息可以标记为已处理.
快速问题 - 是否可以让两名后勤工作人员同时运行?我似乎记得尝试过这一次并得到一个错误,并且似乎还记得读到你只能有一个...我找不到另一个线程,谈论有多个明确但...
任何想法都非常感谢!
干杯
我在给定的特定时间运行backgroundworker时遇到问题.
我的代码只用了一秒就运行了后台工程师.
我想在后台增加Interval时间.
我正在使用这行代码在按钮单击事件中运行后台:
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)
然后在backgroundWorker1_DoWork:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
backgroundWorker1.CancelAsync();
}
Run Code Online (Sandbox Code Playgroud)
最后backgroundWorker1_RunWorkCompleted:
private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)
我想连续运行背景,但每5秒或超过5秒.
如果有人能帮助我,我将非常感激,
提前致谢.
我正在用C#编写一个下载程序并停止了以下问题:我应该使用什么样的方法来并行化我的下载并更新我的GUI?
在我的第一次尝试中,我使用了4个线程,并且在每个线程完成时我开始了另一个:主要问题是我的cpu在每个新线程启动时都是100%.
谷歌搜索,我发现BackgroundWorker和ThreadPool的存在:声明我想用我正在下载的每个链接的进度更新我的GUI,什么是最好的解决方案?
1)创建4个不同的BackgroundWorker,附加到每个ProgressChanged事件,委托我的GUI中的函数来更新进度?
2)使用ThreadPool并将最大和最小线程数设置为相同的值?
如果我选择#2,当队列中没有更多线程时,是否会停止4个工作线程?它暂停了吗?由于我必须下载不同的链接列表(每个链接20个链接)并在完成一个链接时从一个链接移动到另一个链接,ThreadPool是否在每个列表之间启动和停止线程?
如果我想在live上更改工作线程的数量并决定使用ThreadPool,从10个线程更改为6,它是否会抛出异常并停止4个随机线程?
这是让我头疼的唯一部分.我提前感谢你们每个人的答案.
c# multithreading backgroundworker download-manager threadpool
我在Winform应用程序中的后台工作器中有一个循环.
我刚刚使用了此代码,但在暂停后它不会恢复.
在主类我使用这个
System.Threading.ManualResetEvent _busy = new System.Threading.ManualResetEvent(false);
然后在我的开始点击我写了这个:
if (!backgroundWorker1.IsBusy)
{
MessageBox.Show("Not Busy"); //Just For Debugg
_busy.Set();
Start_Back.Text = "Pause";
backgroundWorker1.RunWorkerAsync(tempCicle);
}
else
{
_busy.Reset();
Start_Back.Text = "Resume";
}
btnStop.Enabled = true;
Run Code Online (Sandbox Code Playgroud)
然后在backgroundworker doWork中我写了这个:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
m_addTab addTabsInvoke = addTabUrl2;
Invoke(addTabsInvoke, "http://www.google.com");
foreach (something)
{
_busy.WaitOne();
if (backgroundWorker1.CancellationPending)
{
return;
}
if (tabs.InvokeRequired)
{
......
......
Run Code Online (Sandbox Code Playgroud)
我不明白为什么暂停工作,而简历不起作用.我错了什么?
我正在开发一个显示多个TabItems 的支持工具TabControl.每个TabItem代表一个员工,在这些员工Tab的每个人中都有另一个TabControl包含额外TabItem的员工.这些TabItem代表该员工的Outlook文件夹(如"正在工作","已完成"等).这些文件夹中TabItem的每一个都包含一个ListBox绑定到与该Outlook文件夹相关ObservableCollection的MailItems的文件夹.这些不是巨大的收藏 - 每个只有十几件ListBox.虽然总的来说,所有人都TabItem可以想到100件左右.
我目前构建应用程序的方式是应用程序启动并使用相应的员工选项卡和子选项卡填充屏幕.这个过程相当快,我很高兴.我创建了一个静态Global.System.Timer文件,所有文件夹TabItem的代码隐藏都与之同步.因此,应用程序每5分钟清除一次ObserverableCollection并重新扫描Outlook文件夹.
问题是扫描过程使应用程序停止.我尝试使用a BackgroundWorker从Outlook收集邮件作为后台进程,然后将一个List<MailItem>对象传递给一个RunWorkerCompleted方法,然后运行一个this.Dispatcher.BeginInvoke清除相应的进程,ObservableCollection然后将项目从List<MailItem>后面添加到ObservableCollection.我甚Dispatcher至将此设置为较低优先级.
尽管如此,在扫描/填充ListBox过程中应用程序非常笨重.我不清楚如何更好地设计这个,我承认我对此有些新意.我意识到清除每个ObservableCollections都是低效的,但Outlook文件夹更改事件并不是特别可靠,所以我需要每隔一段时间重新扫描一次以确保所有MailItems都被表示.
下面是我的WPF控件的代码,其中包含ListBox.请记住,这些ListBox控件中大约有10个同时处于活动状态.
// This entire UserControl is essentially a ListBox control
public partial class TicketListView : …Run Code Online (Sandbox Code Playgroud) 我是线程世界的新手,但我正在研究的应用程序的一些方面要求我使用BackgroundWorker控件来防止UI在执行某些文件操作时冻结.
我要做的是从BackgroundWorker中更新几个表单标签.从来没有使用过这个之前我很快发现我无法访问未在同一个线程中创建的控件,因此经过一些研究后我实现了以下代码,似乎可以使一切工作:
Private Delegate Sub DelegateUpdateStatus(ByVal statusText As String, ByRef currentFile As String)
Private Sub UpdateStatus(ByVal statusText As String, ByVal currentFile As String)
If InvokeRequired Then
Invoke(Sub() LblStatus.Text = statusText)
Invoke(Sub() LblCurrentFile.Text = currentFile)
Else
LblStatus.Text = statusText
LblCurrentFile.Text = currentFile
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
但事情是,我不知道这个代码在做什么,或者为什么需要它.
我做了一些研究,但我没有做过任何真正的工作,我读过的大多数文章都假设了一些先验知识.
我希望了解的三个主要内容:
如上所述,线程仍然是一个非常外国的概念,所以任何简单的英语答案都会非常有用 - 谢谢!
编辑:感谢大家到目前为止的回复.我已经做了一些进一步的阅读,我想知道我是否正确地采用了这种方式.我使用BackgroundWorker的原因是为了确保在我执行文件操作时UI保持响应.问题是,我仍然需要等到BackgroundWorker完成它的工作,所以我可以返回一个指示操作成功的布尔值.有办法解决这个问题,但是从我的阅读中,不得不等待BackgroundWorker完成它的工作就是首先要破坏使用它的目的.那么,阻止UI锁定的最佳方法是什么?
我是第一次成立背景工作者.它主要是在代码运行时工作,我的停止/取消按钮正在工作.但是,我也在尝试报告更新进度条的进度,但我根本无法解决这个问题.
我从点击按钮启动代码,运行此代码:
backgroundWorker1.WorkerSupportsCancellation = true;
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.RunWorkerAsync();//this invokes the DoWork event
Run Code Online (Sandbox Code Playgroud)
我的Do_Work方法:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
int j = 0;// Count cumulative imported files
int countDupFiles = 0;// Count number of previously imported csv files
int countImportedFiles = 0;// Count imported files
foreach (string folderPath in csvDirList)
{
string[] csvFileNames = Directory.GetFiles(@folderPath, "*.csv");
frmImportCsvData.replaceAll(csvFileNames, folderPath + "\\", "");
for (int i = 0; i < csvFileNames.Length; i++, j++)
{ …Run Code Online (Sandbox Code Playgroud) 我希望在服务器启动时在我的rails应用程序中订阅mqtt主题,并保持订阅始终处于活动状态并正在运行.
我正在使用这个mqtt gem进行mqtt通信:https: //github.com/njh/ruby-mqtt
这就是我现在所拥有的:
在application.rb中:
config.after_initialize do
mqttSub = BackgroundMQTT.new
mqttSub.run
end
Run Code Online (Sandbox Code Playgroud)
BackgroundMQTT类:
class MQTTSubscriber
def run
Thread.new do
MQTT::Client.connect(:host => 'localhost', :port => 1883,) do |c|
c.get('#') do |topic,message|
puts "#{topic}: #{message}"
#Do things, access activerecord etc.
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
所以基本上mqtt订阅从after_initialize方法开始,据我所知,不会自动停止?
另外如您所见,我正在线程中运行订阅,否则我的rails应用程序将停止执行除听取mqtt订阅之外的任何其他操作.
这似乎至少在前几分钟有效.
我不确定这是否是我想做的事情的推荐方式.这会导致我没有考虑过的任何问题吗?这样做的推荐方法是什么?
backgroundworker ×10
c# ×7
.net ×2
delegates ×1
dispatcher ×1
hwnd ×1
invoke ×1
mqtt ×1
ruby ×1
threadpool ×1
timer ×1
twain ×1
vb.net ×1
wpf ×1