gpt4 book ai didi

c# - WP8 后台代理 - 代码在代理外部执行良好,但在代理内部失败?

转载 作者:行者123 更新时间:2023-12-02 14:06:16 25 4
gpt4 key购买 nike

我创建了一个后台代理来更新我的动态磁贴。代理调度和执行得很好,但代理执行的代码却成了问题——它根本无法完全执行并且不提供任何错误。据我所知,我正在使用的 API 没有受到限制,除非 Cimbalino 工具包以某种方式提供了问题,即使我使用的是 NuGet 中的后台代理特定版本。

当 RenderText() 和 RenderTextWide() 无法运行时,代码似乎停止执行。没有提供错误。在前台应用程序中运行时,相同的代码可以完美运行。

using System;
using System.Windows;
using Microsoft.Phone.Scheduler;
using Microsoft.Phone.Shell;
using Microsoft.Phone.Info;
using Cimbalino.Phone.Toolkit;
using System.Linq;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System.Windows.Controls;
using System.IO.IsolatedStorage;
using Cimbalino.Phone.Toolkit.Extensions;

namespace ScheduledTaskAgent1
{
public class ScheduledAgent : ScheduledTaskAgent
{
private static volatile bool _classInitialized;

public ScheduledAgent()
{
if (!_classInitialized)
{
_classInitialized = true;
// Subscribe to the managed exception handler
Deployment.Current.Dispatcher.BeginInvoke(delegate
{
Application.Current.UnhandledException += ScheduledAgent_UnhandledException;
});
}
}

/// Code to execute on Unhandled Exceptions
private void ScheduledAgent_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
if (System.Diagnostics.Debugger.IsAttached)
{
System.Diagnostics.Debugger.Break();
}
}

//Method to create normal tile image
private static void RenderText(string currproperty)
{
WriteableBitmap b = new WriteableBitmap(336, 336);
var canvas = new Grid();
canvas.Width = b.PixelWidth;
canvas.Height = b.PixelHeight;
var background = new Canvas();
background.Height = b.PixelHeight;
background.Width = b.PixelWidth;

SolidColorBrush backColor = new SolidColorBrush(Colors.Transparent);
background.Background = backColor;

TextBlock currtemp = new TextBlock();
currtemp.FontSize = 100;
currtemp.FontFamily = new FontFamily("Segoe UI Light");
currtemp.FontWeight = FontWeights.Bold;
currtemp.Foreground = new SolidColorBrush(Colors.White);
currtemp.Text = currproperty;
currtemp.Margin = new Thickness(20, 10, 0, 0);
currtemp.Width = b.PixelWidth - currtemp.Margin.Left * 2;
canvas.Children.Add(currtemp);

b.Render(background, null);
b.Render(canvas, null);
b.Invalidate();
using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
{
using (IsolatedStorageFileStream imageStream = new IsolatedStorageFileStream("/Shared/ShellContent/BackBackgroundImage2.png", System.IO.FileMode.Create, isf))
{

b.SavePng(imageStream);
}
}
}

//Method to create wide tile image
private static void RenderTextWide(string currproperty)
{
WriteableBitmap b = new WriteableBitmap(691, 336);
var canvas = new Grid();
canvas.Width = b.PixelWidth;
canvas.Height = b.PixelHeight;
var background = new Canvas();
background.Height = b.PixelHeight;
background.Width = b.PixelWidth;

//Created background color as Accent color
SolidColorBrush backColor = new SolidColorBrush(Colors.Transparent);
background.Background = backColor;

TextBlock currtemp = new TextBlock();
currtemp.FontSize = 100;
currtemp.FontFamily = new FontFamily("Segoe UI Light");
currtemp.FontWeight = FontWeights.Bold;
currtemp.Foreground = new SolidColorBrush(Colors.White);
currtemp.Text = currproperty;
currtemp.Margin = new Thickness(20, 10, 0, 0);
currtemp.Width = b.PixelWidth - currtemp.Margin.Left * 2;
canvas.Children.Add(currtemp);

using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
{
using (IsolatedStorageFileStream imageStream = new IsolatedStorageFileStream("/Shared/ShellContent/WideBackBackgroundImage2.png", System.IO.FileMode.Create, isf))
{
b.SavePng(imageStream);
}
}
}

//When task invokes, run the tile update code.
protected override void OnInvoke(ScheduledTask task)
{
ShellTile tile = ShellTile.ActiveTiles.FirstOrDefault();
if (tile != null)
{
FlipTileData flipTile = new FlipTileData();
flipTile.Title = "";
flipTile.BackTitle = "Atmosphere";
RenderText("Test");
RenderTextWide("Test");
flipTile.BackBackgroundImage = new Uri("/Assets/NewUI/1.PNG", UriKind.Relative); //Default image for Background Image Medium Tile 336x336 px
flipTile.BackgroundImage = new Uri(@"isostore:/Shared/ShellContent/BackBackgroundImage2.png", UriKind.Absolute); //Generated image for Back Background 336x336

flipTile.WideBackBackgroundImage = new Uri("/Assets/NewUI/2.PNG", UriKind.Relative); ////Default image for Background Image Wide Tile 691x336 px
flipTile.WideBackgroundImage = new Uri(@"isostore:/Shared/ShellContent/WideBackBackgroundImage2.png", UriKind.Absolute);
tile.Update(flipTile);

//Tile updated, tell agent operation complete
NotifyComplete();
}
}
}
}

最佳答案

我刚刚运行了您在附加了调试器的后台代理中共享的代码,问题非常明显 - 它引发了异常!准确地说,是无效的跨线程访问异常。所有与 UI 相关的工作都必须在 UI 线程和实例化控件中进行,而 WriteableBitmaps 就是这样的工作。

解决方案

您需要使用Deployment.Current.Dispatcher.BeginInvoke在适当的线程中调用RenderTextRenderTextWide。您还可以在 UI 线程中调用 OnInvoke 中的所有内容。

注意: Deployment.Current.Dispatcher.BeginInvoke 异步调用给定的操作,因此如果您不在 UI 线程上运行所有内容,则可能需要执行以下操作同步不同线程的东西。

通知完成

完成所有工作后,您必须始终调用 NotifyComplete。基本上,您需要做的是 try-catch(all),然后调用 NotifyComplete。另外,您可能希望将其放入 ScheduledAgent_UnhandledException 以防万一。

NotifyComplete 不应像代码中那样位于 if 中,尽管该条件在 Windows Phone 中始终成立。 ShellTile.ActiveTiles 始终至少有一个图 block - 主图 block - 即使它没有固定。

调试后台代理

是的,你可以做到。如果代理无法工作,查看问题所在的最佳方法是启动附加了调试器的应用程序,强制调用后台代理,并在要检查的代码中放置一个断点。使用ScheduledActionService.LaunchForTest比正常情况更早启动后台代理。

离题/问题

请问您想通过 private static volatile bool _classInitialized 字段实现什么目的?为什么它是 volatile

关于c# - WP8 后台代理 - 代码在代理外部执行良好,但在代理内部失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24373308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com