C# 如何安全地从InkPresenter.StrokeCollected事件打开线程?调试与维护&!在未处理的异常上禁用\u XAML \u生成的\u中断\u
sigsend.AddStrokes(e1)将导致调试&!在未处理的异常上禁用\u XAML \u生成的\u中断\u。sigend是UWP应用程序中的inkstrokecontainer类instanc 代码如下:C# 如何安全地从InkPresenter.StrokeCollected事件打开线程?调试与维护&!在未处理的异常上禁用\u XAML \u生成的\u中断\u,c#,multithreading,xaml,uwp,C#,Multithreading,Xaml,Uwp,sigsend.AddStrokes(e1)将导致调试&!在未处理的异常上禁用\u XAML \u生成的\u中断\u。sigend是UWP应用程序中的inkstrokecontainer类instanc 代码如下: inkpane.InkPresenter.StrokesCollected += rooPage.snink; public async void snink(InkPresenter sender, InkStrokesCollectedEventA
inkpane.InkPresenter.StrokesCollected += rooPage.snink;
public async void snink(InkPresenter sender, InkStrokesCollectedEventArgs args)
{ task.run(()=>
{ sigsend.Clear();
sigsend.AddStrokes(e1);
var lstream = new MemoryStream();
await sigsend.SaveAsync(lstream.AsOutputStream());
var siginkbuffer = lstream.ToArray();
});
}
sigend是一个inkstrokecontainer。这将导致[DEBUG&!DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION]
我尝试了许多方法,例如使用task.run或Windows.System.Threading.ThreadPool.RunAsync,以确保任务在UI线程的后台安装中运行,但不使用usless。我还尝试使用task.run在后台任务中运行此代码,并在后台任务中使用and(CoreDispatcherPriority.Low,async()=>等运行sigsend.AddStrokes(e1)来查看UI线程。但所有这些都是无用的,它总是会导致调试和禁用\u XAML\u生成的\u BREAK\u ON\u UNHANDLED\u异常
sigsend没有绑定到inkcanva,我只是用它来序列化inkstroke
为什么?原因是什么?我认为这是UI线程中的一些问题
新建:
我尝试了一些其他代码,发现似乎是异步等待方法导致了这种情况,如果
inkpane.InkPresenter.StrokesCollected += rooPage.snink;
public **async** void snink(InkPresenter sender, InkStrokesCollectedEventArgs args)
{ await task.run(etc.);
}
将导致错误
我必须打开一个新任务,因为如果InkPresenter.StrokeCollected事件的绑定方法中的工作负载太重,它还将导致调试和禁用未处理异常上的\u XAML\u生成的\u BREAK\u。但是如果我使用wait task.run()并将async添加到snink方法,它将导致调试和禁用\u XAML\u生成的\u BREAK\u ON\u UNHANDLED\u异常
所以,问题是,如何安全地打开线程
new1下面是简单的代码,我没有访问task.run中的UI代码。ink1是xaml中的inkcanvas UI控件。istring是一个大约1kb的json字符串。如果运行此代码,将导致
#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>
{
if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
下面是简单的代码
public sealed partial class wpage : Page
{
public wpage()
{
this.InitializeComponent();
ink1.InkPresenter.StrokeContainer = inkStrokeContainer1;
ink1.InkPresenter.StrokesCollected += InkPresenter_StrokesCollected;
ink1.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Pen | CoreInputDeviceTypes.Mouse;
}
string istring;
public async void InkPresenter_StrokesCollected(InkPresenter sender, InkStrokesCollectedEventArgs args)
{
await sic(istring);
}
public Task sic (String js)
{
var ts = Task.Run(async () =>
{
using (MemoryStream memoryStream1 = new MemoryStream())
{
using (StreamWriter streamWriter1 = new StreamWriter(memoryStream1))
{
await streamWriter1.WriteAsync(js);
await streamWriter1.FlushAsync();
using (MemoryStream memoryStream2 = new MemoryStream())
{
Compressor compressor1 = new Compressor(memoryStream2.AsOutputStream(), CompressAlgorithm.Lzms, 32768);
await compressor1.WriteAsync(memoryStream1.ToArray().AsBuffer());
await compressor1.FinishAsync();
}
}
}
});
return ts;
}
}
所以,问题是,如何安全地打开线程
从问题描述中可以看出,您使用了Task.Run
和CoreDispatcher
,但它们没有效果。您是否尝试同时使用这两种方法
公共异步无效测试()
{
等待任务。运行(异步()=>
{
wait Dispatcher.RunAsync(CoreDispatcherPriority.Normal,()=>
{
//代码在这里
});
});
}
从你发布的代码中,只使用任务。Run
是打开一个新线程,外部线程不能直接访问UI线程,但通过CoreDispatcher
可以访问,所以综合使用两者是一个不错的选择
如果您想要更好的性能,Windows社区工具包提供了类来帮助您更好地执行异步编程
致以最良好的祝愿。您好,当发生此错误时,您应该跳转到App.g.i.cs页面。您可以在Visual Studio界面底部的调试窗口中找到名为
$exception
的变量,该变量可能包含错误的详细信息,您可以使用它来了解错误的原因mistake@Richard张MSFT,ths App.gics刚刚显示:DEBUG&!DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION UnhandledException+=(发送方,e)=>{if(全局::System.Diagnostics.Debugger.IsAttached)全局::System.Diagnostics.Debugger.BREAK();}##endif}}您好,这是代码,请注意您的Visual Studio调试窗口,如本文所述,检查变量$exception
,该变量包含错误详细信息。@Richard Zhang MSFT我知道在大多数情况下vs都会显示此信息,但这次不会显示。异常似乎是由xaml线程引起的@Richard Zhang MSFT Hi谢谢。我在中编写了一些代码。我尝试过调用一个操作,使用或不使用Dispatcher.RunAsync和task.run以及与它们的许多排列和组合。仍然无法解决问题。这个方法在我询问之前已经使用过,并且仍然会导致此异常。问题是,如果我使用async和Wait,xaml线程将启动。您可以尝试InkPresenter.StrokeCollected事件,该事件位于UWP的input.inking名称空间中。您好,谢谢。我在中编写了一些代码。我尝试过调用操作、使用或不使用Dispatcher.RunAsync和task.run以及许多排列和组合。仍然无法解决问题。他说llo,请检查以下内容:首先,您是否将InkCanvas
添加到可视化树中。其次,事件触发时是否加载了InkCanvas
,此错误可能是由绑定引起的。如果您能提供最低限度的可运行演示,这将非常有帮助。张:嗨,谢谢。我添加了最低限度的可运行演示。此错误似乎没有问题因为如果我在其他事件中调用sic方法,比如指针移动,它也会爆炸。