как безопасно открывает поток из события InkPresenter.StrokesCollected? DEBUG &&! DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION - PullRequest
0 голосов
/ 31 октября 2019

sigsend.AddStrokes (e1) вызовет DEBUG &&! DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION. sigend - это экземпляр класса контейнера для рукописного ввода в приложении UWP.

ниже приведен код:

     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_UNHANDLED_EXCEPTION]

у меня есть много методов, таких как use task.run или Windows.System.Threading.ThreadPool.RunAsync, чтобы убедиться, что задача запускается в фоновом режиме. , но бесполезно. Я также пытаюсь использовать task.run для запуска этого кода в фоновой задаче, а в задании backgroun используйте и (CoreDispatcherPriority.Low, async () => и т. Д. Для запуска sigsend.AddStrokes (e1) для просмотра потока пользовательского интерфейса. Но все они бесполезны, они всегда вызывают DEBUG &&! DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION.

sigsend не привязан к инккане, я просто использую его для сериализации чернильного удара в нем.

Почему? Что? это причина? Я думаю, что это какой-то вопрос в UI Threading.

new:

Я попробовал какой-то другой код, обнаружил, что, кажется, это asyncМетод await вызывает это, если

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

вызовет ошибку.

Я должен открыть новую задачу, потому что если рабочая нагрузка в привязкеМетод события InkPresenter.StrokesCollected слишком тяжелый, он также вызовет DEBUG &&! DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION. Но если я использую await task.run () и добавлю асинхронность в метод snink, это вызоветDEBUG &&! DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION.

Итак, вопрос в том, как безопасно открыть поток?

new1 Ниже приведен простой код, я не посещаю код пользовательского интерфейса в task.run .ink1элемент управления пользовательским интерфейсом в xamlistring является строкой json размером около 1 КБ. и запустить этот код, он вызовет

#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;
    }


}

1 Ответ

0 голосов
/ 31 октября 2019

Итак, вопрос в том, как безопасно открыть поток?

Как видно из описания проблемы, вы использовали Task.Run и CoreDispatcher, но онине имеют никакого эффекта. Вы пытались использовать оба одновременно?

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

Из кода, который вы разместили, используя только Task.Run, чтобы открыть новый поток, внешний поток не может напрямую получить доступ к потоку пользовательского интерфейса, ночерез CoreDispatcher доступ, так что всестороннее использование этих двух вариантов является хорошим выбором.

Если вы хотите повысить производительность, Windows Community Toolkit предоставляет класс DispatcherHelper , который поможет вам лучшевыполнять асинхронное программирование.

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...