Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何安全地从InkPresenter.StrokeCollected事件打开线程?调试与维护&!在未处理的异常上禁用\u XAML \u生成的\u中断\u_C#_Multithreading_Xaml_Uwp - Fatal编程技术网

C# 如何安全地从InkPresenter.StrokeCollected事件打开线程?调试与维护&!在未处理的异常上禁用\u XAML \u生成的\u中断\u

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

sigsend.AddStrokes(e1)将导致调试&!在未处理的异常上禁用\u XAML \u生成的\u中断\u。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是一个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方法,比如指针移动,它也会爆炸。