다음을 통해 공유

Windows 11 PC에서 실행된 WPF 프로그램에서, DataGrid에 한글 문자를 빠르게 입력하면 프로그램이 강제 종료됩니다

hornet22 20 평판 포인트
2024-09-19T10:05:40.8433333+00:00

단순히 DataGrid에 ObservableCollection을 바인딩하고, 한글을 빠르게 입력하면서 엔터를 계속 눌렀을 뿐임에도 아래와 같은 에러가 발생합니다.

OS : Windows 11 Pro, Home

.net 6.0, .net 8.0

Application: WpfApp1.exe

CoreCLR Version: 6.0.1623.17311

.NET Version: 6.0.16

Description: The application requested process termination through System.Environment.FailFast(string message).

Message: 복구할 수 없는 시스템 오류입니다.

Stack:

at System.Environment.FailFast(System.String)

at System.Windows.Documents.TextStore.VerifyTextStoreConsistency()

at System.Windows.Documents.TextStore.GrantLock()

at System.Windows.Documents.TextStore.GrantLockWorker(LockFlags)

at System.Windows.Documents.TextStore.RequestLock(LockFlags, Int32 ByRef)

at MS.Win32.UnsafeNativeMethods+ITextStoreACPSink.OnSelectionChange()

at MS.Win32.UnsafeNativeMethods+ITextStoreACPSink.OnSelectionChange()

at System.Windows.Documents.TextStore.OnSelectionChanged()

at System.Windows.Documents.TextSelection.System.Windows.Documents.ITextRange.NotifyChanged(Boolean, Boolean)

at System.Windows.Documents.TextRangeBase.EndChange(System.Windows.Documents.ITextRange, Boolean, Boolean)

at System.Windows.Documents.TextRange.System.Windows.Documents.ITextRange.EndChange(Boolean, Boolean)

at System.Windows.Documents.TextRange+ChangeBlock.System.IDisposable.Dispose()

at System.Windows.Documents.TextEditorTyping.DoTextInput(System.Windows.Documents.TextEditor, System.String, Boolean, Boolean)

at System.Windows.Documents.TextEditorTyping+TextInputItem.Do()

at System.Windows.Documents.TextEditorTyping.ScheduleInput(System.Windows.Documents.TextEditor, InputItem)

at System.Windows.Documents.TextEditorTyping.OnTextInput(System.Object, System.Windows.Input.TextCompositionEventArgs)

at System.Windows.Controls.Primitives.TextBoxBase.OnTextInput(System.Windows.Input.TextCompositionEventArgs)

at System.Windows.UIElement.OnTextInputThunk(System.Object, System.Windows.Input.TextCompositionEventArgs)

at System.Windows.Input.TextCompositionEventArgs.InvokeEventHandler(System.Delegate, System.Object)

at System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate, System.Object)

at System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean)

at System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject, System.Windows.RoutedEventArgs)

at System.Windows.UIElement.RaiseTrustedEvent(System.Windows.RoutedEventArgs)

at System.Windows.Input.InputManager.ProcessStagingArea()

at System.Windows.Input.TextCompositionManager.UnsafeCompleteComposition(System.Windows.Input.TextComposition)

at System.Windows.Input.DefaultTextStore.OnTransitoryExtensionUpdated(ITfContext, Int32, ITfRange, ITfRange, Boolean ByRef)

at MS.Win32.UnsafeNativeMethods+ITfThreadMgr.SetFocus(ITfDocumentMgr)

at MS.Win32.UnsafeNativeMethods+ITfThreadMgr.SetFocus(ITfDocumentMgr)

at System.Windows.Documents.TextStore.OnGotFocus()

at System.Windows.Documents.TextServicesHost._RegisterTextStore(System.Windows.Documents.TextStore)

at System.Windows.Documents.TextStore.OnAttach()

at System.Windows.Documents.TextEditor.InitTextStore(System.Object)

at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)

at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)

at System.Windows.Threading.DispatcherOperation.InvokeImpl()

at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(System.Object)

at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)

at MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext, System.Threading.ContextCallback, System.Object)

at System.Windows.Threading.DispatcherOperation.Invoke()

at System.Windows.Threading.Dispatcher.ProcessQueue()

at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)

at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)

at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)

at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)

at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)

at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)

at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)

at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)

at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)

at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)

at System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)

at System.Windows.Threading.DispatcherOperation.Wait(System.TimeSpan)

at System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherOperation, System.Threading.CancellationToken, System.TimeSpan)

at System.Windows.Threading.Dispatcher.Invoke(System.Action, System.Windows.Threading.DispatcherPriority, System.Threading.CancellationToken, System.TimeSpan)

at System.Windows.Threading.Dispatcher.Invoke(System.Action, System.Windows.Threading.DispatcherPriority)

at System.Windows.Controls.DataGridTextColumn.OnInput(System.Windows.Input.InputEventArgs)

at System.Windows.Controls.DataGridCell.OnPreviewKeyDown(System.Windows.Input.KeyEventArgs)

at System.Windows.UIElement.OnPreviewKeyDownThunk(System.Object, System.Windows.Input.KeyEventArgs)

at System.Windows.Input.KeyEventArgs.InvokeEventHandler(System.Delegate, System.Object)

at System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate, System.Object)

at System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean)

at System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject, System.Windows.RoutedEventArgs)

at System.Windows.UIElement.RaiseTrustedEvent(System.Windows.RoutedEventArgs)

at System.Windows.Input.InputManager.ProcessStagingArea()

at System.Windows.Input.InputProviderSite.ReportInput(System.Windows.Input.InputReport)

at System.Windows.Interop.HwndKeyboardInputProvider.ReportInput(IntPtr, System.Windows.Input.InputMode, Int32, System.Windows.Input.RawKeyboardActions, Int32, Boolean, Boolean, Int32)

at System.Windows.Interop.HwndKeyboardInputProvider.ProcessKeyAction(System.Windows.Interop.MSG ByRef, Boolean ByRef)

at System.Windows.Interop.HwndSource.CriticalTranslateAccelerator(System.Windows.Interop.MSG ByRef, System.Windows.Input.ModifierKeys)

at System.Windows.Interop.HwndSource.OnPreprocessMessage(System.Object)

at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)

at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)

at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)

at System.Windows.Interop.HwndSource.OnPreprocessMessageThunk(System.Windows.Interop.MSG ByRef, Boolean ByRef)

at System.Windows.Interop.ComponentDispatcherThread.RaiseThreadMessage(System.Windows.Interop.MSG ByRef)

at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)

at System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)

at System.Windows.Threading.Dispatcher.Run()

at System.Windows.Application.RunDispatcher(System.Object)

at System.Windows.Application.RunInternal(System.Windows.Window)

at System.Windows.Application.Run()

at WpfApp1.App.Main()

문제를 재현해볼 수 있는 소스코드입니다. 매우 단순합니다.

MainWindow.xaml


<Window x:Class="WpfApp1.MainWindow"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    xmlns:local="clr-namespace:WpfApp1"

    mc:Ignorable="d"

    Title="MainWindow" Height="450" Width="800">
 <Grid>


<DataGrid ItemsSource="{Binding Items}">

</DataGrid>
 </Grid>

</Window>

MainWindow.xaml.cs


using System;

using System.Collections.Generic;

using System.Collections.ObjectModel;

using System.Collections.Specialized;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

namespace WpfApp1 {

/// <summary>

/// Interaction logic for MainWindow.xaml

/// </summary>

public partial class MainWindow : Window,INotifyCollectionChanged {

    public ObservableCollection<TestItem> Items { get; set; } = new() {

        new TestItem() {

            Content = "sdf",

            Title = "sdf"

        }

    };

    public event NotifyCollectionChangedEventHandler? CollectionChanged;

    public MainWindow() {

        InitializeComponent();

        DataContext = this;

    }

}
}

TestItem.cs


namespace WpfApp1; 

public class TestItem {

public string Title { get; set; }

public string Content { get; set; }
}

여러 다른 PC에서 실행시켜서 재현해봐도 항상 같은 오류가 발생합니다.

.net을 8.0으로 변경하여도 동일한 오류가 발생합니다.

현재로서는 Datagrid에서 한글을 빠르게 입력하면서 엔터를 눌렀을때 프로그램이 강제종료되는 문제를 해결할 수 없을까요?

Visual Studio
Visual Studio
Windows, 웹 및 모바일 디바이스용 애플리케이션을 빌드하기 위한 통합 개발 도구 제품군입니다.
질문 42개
Microsoft Q&A
Microsoft Q&A
이 태그를 사용하여 제안, 기능 요청 및 버그를 Microsoft Q&A 팀과 공유합니다. Microsoft Q&A 팀은 정기적으로 피드백을 평가하고 그 과정에서 업데이트를 제공합니다.
질문 273개
댓글 0개 설명 없음
투표 {count}개

수락된 답변
  1. Wenying Lu-MSFT 2,070 평판 포인트 Microsoft 공급업체
    2024-09-20T09:18:30.3766667+00:00

    안녕하세요 @hornet22 님,

    Microsoft Q&A 포럼에 게시해 주셔서 감사합니다.

    충돌의 근본 원인은 WPF 텍스트 시스템(TextStore)의 내부 작동 방식과 관련이 있으며, 특히 한국어와 같이 입력기(IME)를 사용하는 언어의 경우 텍스트 입력 방법과 상호 작용하는 방식에 문제가 있습니다.

    IME와 결합된 빠른 입력으로 인해 WPF 텍스트 렌더링 또는 입력 처리 시스템에 불일치가 발생할 수 있습니다. 이로 인해 FailFast 환경 오류가 발생하며, 이는 일반적으로 WPF 텍스트 입력 하위 시스템이 내부 일관성을 유지하지 못해 애플리케이션이 종료될 때 발생합니다.

    테스트 단계가 무엇인지 잘 모르겠네요. 다음 속성을 추가하여 도움이 되는지 확인해 보시기 바랍니다.

    <DataGrid ItemsSource="{Binding Items}" TextOptions.TextFormattingMode="Display" InputMethod.IsInputMethodSuspended="True" InputMethod.IsInputMethodEnabled="False"
              VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling" >
    </DataGrid>
    

    TextBox 또는 ListView에서도 동일한 문제가 있는지 확인하실 수 있습니다. 이 문제가 DataGrid에서만 발생하는 경우 입력을 위해 다른 컨트롤로 전환하는 것을 고려해 보세요.

    위의 속성 중 어느 것도 문제를 해결하지 못하는 경우 Microsoft에 버그 보고서를 제출하는 것을 고려해 보실 수 있습니다. 이는 WPF 프레임워크 내의 텍스트 입력 및 IME 상호 작용과 관련된 낮은 수준의 문제인 것으로 보입니다.

    감사합니다.


    도움이 되었다고 생각되는 게시물에 대해 "답변 수락"을 클릭하고 좋아요를 누르십시오.이 답변에 대해 추가 질문이 있는 경우 "댓글"을 추가하십시오. 참고: Q&A에서 이메일 알림을 받으려면 설명서의 지침에 따라 이메일 알림을 활성화하세요.

    1명이 이 답변이 도움이 된다고 생각했습니다.

0 추가 답변

정렬 기준: 가장 유용함

답변

질문 작성자가 수락한 답변이라고 답변에 표시할 수 있으며, 이를 통해 작성자의 문제를 해결한 답변을 사용자가 알 수 있도록 도와줍니다.