如何安全地从 InkPresenter.StrokesCollected 事件打开线程?调试和!DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION



sigsend。AddStrokes(e1(将导致DEBUG&amp!DISABLE_XAML_GENERATED_BREAK_ON_unhanded_EXCEPTION。sigend是UWP应用程序中的一个inkstrokecontainer类instanc。

下面是代码:

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是一个墨迹容器。这将导致[DEBUG&&!DISABLE_XAML_GENERATED_BREAK_ON_UNDHANDLED_EXCEPTION]

我尝试了很多方法,比如使用task.run或Windows。系统线程。线程池。RunAsync,以确保任务在UI线程的后台安装中运行,但无需usless。我还尝试使用task.run在后台任务中运行这段代码,在后台任务使用and(CoreDispatcherPriority.Low,async((=>等来运行sigsend。AddStrokes(e1(以查看UI线程。但是所有这些都是无用的,它总是引起DEBUG&amp!DISABLE_XAML_GENERATED_BREAK_ON_unhanded_EXCEPTION。

sigsend没有绑定到inkcanva,我只是用它来序列化其中的墨迹

为什么?原因是什么?我认为这是UI线程中的一些问题。

新:

我尝试了一些其他代码,发现这似乎是asyncwait方法造成的,如果

inkpane.InkPresenter.StrokesCollected += rooPage.snink;
public **async** void  snink(InkPresenter sender, InkStrokesCollectedEventArgs args)  
{ await task.run(etc.);
}   

将导致错误。

我必须打开一个新任务,因为如果工作负载在InkPresenter的绑定方法中。StrokesCollected事件太重,也会导致DEBUG&amp!DISABLE_XAML_GENERATED_BREAK_ON_unhanded_EXCEPTION。但是,如果我使用await task.run((并将async添加到snink方法中,它将导致DEBUG&amp!DISABLE_XAML_GENERATED_BREAK_ON_unhanded_EXCEPTION。

所以,问题是,如何安全地打开线程?

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.RunCoreDispatcher,但它们没有效果。你试过同时使用两者吗?

public async void Test()
{
await Task.Run(async () =>
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
// code here
});
});
}

从你发布的代码来看,只使用Task.Run是打开一个新的线程,外部线程不能直接访问UI线程,而是通过CoreDispatcher可以访问,所以综合使用两者是一个不错的选择。

如果您想要更好的性能,Windows社区工具包提供DispatcherHelper类来帮助您更好地执行异步编程。

致以最良好的问候。

最新更新