在PowerShell中同时运行后台后台作业非常简单,但我似乎无法使其与新(在v3中)cmdlet Invoke-WebRequest一起使用。
我有数千个文件正在通过PowerShell脚本下载。效果很好,但是连续进行需要几天的时间:
for($f=0;$f -lt $urlList.Count;$f++)
{
$remote = $urlList[$f] + $fileList[$f]
$local = 'C:\folder\' + $fileList[$f]
Invoke-WebRequest $remote -Method Get -OutFile $local -UserAgent FireFox
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过利用“ AsJob”方法进行多次尝试,但是它们要么出错,要么完全正常,但是没有保存任何本地文件。这是后者的一个示例:
for($f=0;$f -lt $urlList.Count;$f++)
{
$remote = $urlList[$f] + $fileList[$f]
$local = 'C:\folder\' + $fileList[$f]
$command = "Invoke-WebRequest $remote -Method Get -OutFile $local -UserAgent FireFox"
Start-Job {Invoke-Expression -Command $command}
}
Get-Job|Wait-Job
Run Code Online (Sandbox Code Playgroud)
输出示例:
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
339 Job339 BackgroundJob Running True localhost Invoke-Expression …Run Code Online (Sandbox Code Playgroud) powershell download background-process cmdlet powershell-3.0
我希望从iOS 7后台运行的应用程序向我的服务器发送一些数据(位置坐标).我正在使用NSURLSessions来实现此目的.
我对于我应该用于此目的的会话类型感到困惑:
默认会话:我们可以在后台创建和使用默认会话.如果是,它可以优雅地处理网络故障.
后台会话:我可以使用后台会话将数据作为NSData对象上传.
PS:在这两种情况下,一些代码将非常感谢处理网络故障.
我需要帮助找出在我的应用程序中后台执行的代码.如果我在我的应用程序中运行仪器中的活动监视器,即使按下主页按钮后它也会始终使用大约1%的CPU.
这是,我假设,一旦它的backgroundTimeRemaining已经过期,就会导致iOS将我的应用程序从暂停状态踢出.即使在显然没有发生任何事情的屏幕上,即使我只是让手机睡了几分钟,应用程序仍会使用CPU时间并被踢出暂停状态.
我已经在我的应用程序中完成了对NSTimers的项目范围搜索,以确保在我离开应用程序后没有任何内容被解雇,并且在应用程序接收网络消息的热门地点放置断点,但似乎没有被击中
我已经确认当它没有连接到调试器时仍然会发生这种情况,当我按下主页按钮时,其他应用程序似乎变为0或更接近0 CPU利用率.
什么工具可以帮助我实现目标并找出后台运行的代码?
编辑1:在Petesh的评论之后,我更多地使用了仪器中的Time Profiler,并发现我可以设置检测范围,并在我将应用程序置于挂起状态后仅查看代码运行.我找到了一些不应该运行的代码,我修复了它,但是应用程序在几分钟后仍然被踢出暂停状态!
活动监视器现在只显示0.1-0%的CPU使用率,而应用程序是后台运行的.再次运行Time Profiler会发现,我认为唯一运行的是主运行循环.在后台约一个小时的时间277毫秒.如果我检查"反转调用树"框,则显示时间主要花费在mach_msg_trap上,总时间为46毫秒.我不确定这是否是正常行为.
我已经解决了我的一些问题,但最重要的部分仍然存在.什么阻止我的应用程序停留在暂停状态?
编辑2(固定!):经过深入挖掘后,我找到了罪魁祸首.第三方库正在调用beginBackgroundTaskWithExpirationHandler:,然后endBackgroundTask:在完成时从不调用.因此,我相信iOS认为该应用程序仍在尝试执行后台任务,并且在某个后台时间结束后,即使它没有真正做任何事情,它也终止了应用程序.
仪器中的活动监视器现在在初始后台代码运行后的整个时间内确实显示0%.
自从我第一次提出这个问题以来,我不确定是不是这个或者是我修复的所有东西的组合,但无论哪种方式,它都是固定的!
编辑3:经过更多研究后我发现它实际上不是第三方库的错.该库正在侦听applicationDidEnterBackground通知,因此它可以刷新它的队列.但是在我们自己的applicationDidEnterBackground中,我们还有一个强制刷新队列.因此,它尝试两次启动后台任务,只完成一次.哎呀!
我在我的应用中使用了地理围栏.
地理围栏功能描述:
应用程序在进入或退出该区域时有两种类型的功能:
重置围栏:如果用户将进入该区域并且该区域具有重置围栏的功能,那么app将调用一个Web服务并获取新的围栏列表.此功能也应该在后台模式下工作.
应用程序打开:如果用户将进入该区域并且该区域具有app_open的功能,那么应用程序将
*a. Show alert, if the app is in foreground mode*
*b. Show notification, if the app is in background mode*
Run Code Online (Sandbox Code Playgroud)我已经使用区域监控来实现此功能,并且也不希望使用显着的位置更改,因为应用程序设置了大约100到200米半径的围栏.
现在我的问题是,
我使用下面的代码在后台模式下调用'reset fence'的web服务.
- (void)beginBackgroundUpdateTask {self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^ {[self endBackgroundUpdateTask]; }]; }
- (void)endBackgroundUpdateTask {[[UIApplication sharedApplication] endBackgroundTask:self.backgroundUpdateTask]; self.backgroundUpdateTask = UIBackgroundTaskInvalid; }
因此,我应该在[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandle中应用info.plist中的任何设置.
请进一步指导我.我在互联网上搜索过很多但仍未找到上述两个问题的具体答案.
注意:由于后台模式"位置更新",苹果已拒绝该应用.请建议我苹果不会拒绝该应用程序的方式.
2.16:多任务应用程序只能将后台服务用于其预期目的:VoIP,音频播放,位置,任务完成,本地通知等.----- 2.16 -----我们发现您的应用程序使用后台模式但不包括要求该模式持久运行的功能.此行为不符合App Store审查指南.我们注意到您的应用程序在Info.plist中的UIBackgroundModes键中声明了对位置的支持,但不包括需要持久位置的功能.在应用程序处于后台时添加需要持续使用实时位置更新的功能或从UIBackgroundModes键中删除"位置"设置是合适的.如果您的应用程序不需要持久的实时位置更新,我们建议您使用重要更改位置服务或区域监控位置服务.
非常感谢提前.
您好我正在尝试设置启用了后台传递的运行状况存储观察器.我的问题是,当屏幕被锁定时,它不会传递任何东西.我已经简化了我的代码来解决这个问题:)我在我的plist中有HealthKit并且我接受了healthStore类型的步数.当应用程序打开并且屏幕未锁定时,一切都很好.但是当屏幕被锁定时,我没有得到任何观察.出于测试目的,频率设置为立即.
我的代码如下
- (void)setupHealthStore{
if ([HKHealthStore isHealthDataAvailable])
{
NSSet *readDataTypes = [self dataTypesToRead];
self.healthStore = [[HKHealthStore alloc]init];
[self.healthStore requestAuthorizationToShareTypes:nil readTypes:readDataTypes completion:^(BOOL success, NSError *error)
{
if (success)
{
HKQuantityType *quantityType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
[self.healthStore enableBackgroundDeliveryForType:quantityType frequency:HKUpdateFrequencyImmediate withCompletion:^(BOOL success, NSError *error)
{
if (success)
{
[self setupObserver];
}
}];
}
}];
}
Run Code Online (Sandbox Code Playgroud)
}
在AppDelegate didfinishLaunchWithOptions中调用上述方法
下一个方法是
- (void)setupObserver{
HKQuantityType *quantityType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
HKObserverQuery *query = [[HKObserverQuery alloc]initWithSampleType:quantityType predicate:nil updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error)
{
if (!error)
{
[self alarm]; …Run Code Online (Sandbox Code Playgroud) 我可以在后台运行计时器吗?当我最小化游戏然后我的计时器应该是工作继续我可以吗?
我试过Application.runInBackground=true;但它无法正常工作.
public class Counter : MonoBehaviour
{
public Text counterText;
private int counterValue;
// Use this for initialization
void Start ()
{
Application.runInBackground=true;
StartCoroutine ("StartCounter");
}
IEnumerator StartCounter ()
{
yield return new WaitForSeconds (1f);
counterText.text = "Counter : " + counterValue.ToString ();
counterValue++;
StartCoroutine ("StartCounter");
}
}
Run Code Online (Sandbox Code Playgroud) 我希望我的应用程序在它处于活动状态的背景状态时执行某些操作.我理解根据cordova文档,我可以使用下面的代码执行此操作,这是有效的.
// device APIs are available
//
function onDeviceReady() {
document.addEventListener("resume", onResume, false);
}
// Handle the resume event
//
function onResume() {
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序是使用Ionic构建的,使用上面代码的缺点是它只能在我的app模块之外工作,所以我无法在我的app模块中触发函数.我找到了一些关于它应该如何在我的app模块中工作的代码示例,但是没有它们正在工作.看下面的一些例子.
$ionicPlatform.on('resume', function(){
// rock on
});
Run Code Online (Sandbox Code Playgroud)
/
ionic.Platform.ready(function() {
ionic.on('resume', function(){
//rock on
}, element);
});
Run Code Online (Sandbox Code Playgroud)
/
$ionicPlatform.ready(function () {
document.addEventListener("deviceReady", function () {
document.addEventListener("resume", function () {
$timeout(function () {
//rock on
}, 0);
}, false);
});
});
Run Code Online (Sandbox Code Playgroud)
我忘记了什么,我做错了什么,我希望有人可以帮助我.
谢谢!!
我注意到我的网络应用存在问题 - 当Chrome激活标签未设置为我的应用时,Chrome会停止运行我的JS代码,直到我再次打开标签.
我想它可以节省CPU周期.否则,如果您打开了20个选项卡并且每个选项卡都运行了代码,那么它将很快变慢.
这一切都很好,但我的应用程序要求它继续在后台运行.它可以实时更新图形并每隔几秒钟分析一次数据.
如果我移动到另一个选项卡,图形更新和分析停止(或变得非常慢 - 1秒现在像20秒).然后,当我再次关注制表符时,它恢复正常速度的更新,但由于这种奇怪的时间稀释,图形和数据分析变得奇怪.
基本上,我有一些像这样的代码:
while True:
number = int(len(oilrigs)) * 49
number += money
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
在这之前,我有一个启动屏幕.然而,由于这是真正的循环,它阻止它运行实际的启动屏幕.相反,它只是显示这个.
那么如何将代码放在后台呢?
我想使用tsharkWireshark的命令行风格进行数据包捕获,同时连接到telnet上的远程主机设备.我想调用我为捕获编写的函数:
def wire_cap(ip1,ip2,op_fold,file_name,duration): # invoke tshark to capture traffic during session
if duration == 0:
cmd='"tshark" -i 1 -P -w '+ op_fold+file_name+'.pcap src ' + str(ip1) + ' or src '+ str(ip2)
else:
cmd='"tshark" -i 1 -a duration:'+str(duration)+' -P -w '+ op_fold+file_name+'.pcap src ' + str(ip1) + ' or src '+ str(ip2)
p = subprocess.Popen(cmd, shell=True,stderr=subprocess.PIPE)
while True:
out = p.stderr.read(1)
if out == '' and p.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
出于调试目的,我想在后台运行此函数,并在需要时调用它,并在我获取捕获时停止它.就像是:
Start …Run Code Online (Sandbox Code Playgroud) multithreading subprocess background-process python-2.7 tshark
ios ×4
c# ×1
cmdlet ×1
cordova ×1
cpu-usage ×1
download ×1
geofencing ×1
healthkit ×1
ios7 ×1
iphone ×1
javascript ×1
nsurlsession ×1
objective-c ×1
powershell ×1
python ×1
python-2.7 ×1
resume ×1
subprocess ×1
tshark ×1