Многостраничное настольное приложение в Авалонии выдает ошибку недопустимого потокаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Многостраничное настольное приложение в Авалонии выдает ошибку недопустимого потока

Сообщение Anonymous »

Я пытаюсь создать настольное приложение для Mac и Windows, используя пользовательский интерфейс Avalonia. Сейчас я работаю над добавлением нескольких страниц в приложение, но ничего из того, что я делаю, похоже, не работает!
По сути, я полностью скопировал это: https://github.com/AvaloniaUI/Avalonia .Samples/tree/main/src/Avalonia.Samples/Routing/BasicViewLocatorSample
Однако с другими именами и т. д., потому что я не клонировал его, а просто скопировал и вставил с измененными именами по мере необходимости. Когда я запускаю это, приложение работает нормально, но когда я нажимаю кнопку, чтобы перейти на следующую страницу, оно выдает:

Код: Выделить всё

2024-10-04 22:33:57.166 InfiniteConnect.Desktop[1179:12555] +[IMKClient subclass]: chose IMKClient_Legacy
2024-10-04 22:33:57.166 InfiniteConnect.Desktop[1179:12555] +[IMKInputSession subclass]: chose IMKInputSession_Legacy
Unhandled exception. System.InvalidOperationException: Call from invalid thread
at Avalonia.Threading.Dispatcher.g__ThrowVerifyAccess|16_0()
at Avalonia.AvaloniaObject.GetValue[T](StyledProperty`1 property)
at Avalonia.Controls.Button.get_Command()
at Avalonia.Controls.Button.CanExecuteChanged(Object sender, EventArgs e)
at ReactiveUI.ReactiveCommandBase`2.OnCanExecuteChanged(Boolean newValue) in c:\temp\releaser\ReactiveUI\src\ReactiveUI\ReactiveCommand\ReactiveCommandBase.cs:line 144
at System.Reactive.AnonymousSafeObserver`1.OnNext(T value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.IdentitySink`1.OnNext(T value)
at System.Reactive.Subjects.FastImmediateObserver`1.EnsureActive(Int32 count)
at System.Reactive.Subjects.FastImmediateObserver`1.EnsureActive()
at System.Reactive.Subjects.ReplaySubject`1.ReplayBase.OnNext(T value)
at System.Reactive.Subjects.ReplaySubject`1.OnNext(T value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.IdentitySink`1.OnNext(T value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.Linq.ObservableImpl.DistinctUntilChanged`2._.OnNext(TSource value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.Linq.ObservableImpl.CombineLatest`3._.SecondObserver.OnNext(TSecond value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.IdentitySink`1.OnNext(T value)
at System.Reactive.Subjects.FastImmediateObserver`1.EnsureActive(Int32 count)
at System.Reactive.Subjects.FastImmediateObserver`1.EnsureActive()
at System.Reactive.Subjects.ReplaySubject`1.ReplayBase.OnNext(T value)
at System.Reactive.Subjects.ReplaySubject`1.OnNext(T value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.IdentitySink`1.OnNext(T value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.Linq.ObservableImpl.DistinctUntilChanged`2._.OnNext(TSource value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.IdentitySink`1.OnNext(T value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.Linq.ObservableImpl.Select`2.Selector._.OnNext(TSource value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.Linq.ObservableImpl.Scan`2._.OnNext(TSource value)
at System.Reactive.SafeObserver`1.WrappingSafeObserver.OnNext(TSource value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.ObserveOnObserverLongRunning`1.Drain()
at System.Reactive.ObserveOnObserverLongRunning`1.c.b__17_0(ObserveOnObserverLongRunning`1 self, ICancelable cancelable)
at System.Reactive.Concurrency.DefaultScheduler.LongRunning.LongScheduledWorkItem`1.c.b__3_0(Object thisObject)
at System.Reactive.Concurrency.ConcurrencyAbstractionLayerImpl.c.b__8_0(Object itemObject)
at System.Threading.Thread.StartCallback()

Process finished with exit code 134.
Я получаю две верхние строки, когда приложение открывается, затем появляется ошибка, когда я нажимаю кнопку, и приложение вылетает. Я пробовал много вариантов, все либо ничего не делают, либо вылетают.
Вот текущий код:
MainViewModel.cs

Код: Выделить всё

using DynamicData;
using ReactiveUI;
using System.Windows.Input;

namespace InfiniteConnect.ViewModels
{
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
// Set current page to first on start up
_CurrentPage = Pages[0];

// Create Observables which will activate to deactivate our commands based on CurrentPage state
var canNavNext = this.WhenAnyValue(x => x.CurrentPage.CanNavigateNext);
var canNavPrev = this.WhenAnyValue(x => x.CurrentPage.CanNavigatePrevious);

NavigateNextCommand = ReactiveCommand.Create(NavigateNext, canNavNext);
NavigatePreviousCommand = ReactiveCommand.Create(NavigatePrevious, canNavPrev);
}

// A read.only array of possible pages
private readonly PageViewModelBase[] Pages =
{
new HomeViewModel(),
new JoystickViewModel(),
new ThirdPageViewModel()
};

// The default is the first page
private PageViewModelBase _CurrentPage;

/// 
/// Gets the current page. The property is read-only
/// 
public PageViewModelBase CurrentPage
{
get { return _CurrentPage; }
private set { this.RaiseAndSetIfChanged(ref _CurrentPage, value); }
}

/// 
/// Gets a command that navigates to the next page
/// 
public ICommand NavigateNextCommand { get; }

private void NavigateNext()
{
// get the current index and add 1
var index = Pages.IndexOf(CurrentPage) + 1;

//  /!\ Be aware that we have no check if the index is valid. You may want to add it on your own. /!\
CurrentPage = Pages[index];
}

/// 
/// Gets a command that navigates to the previous page
/// 
public ICommand NavigatePreviousCommand { get; }

private void NavigatePrevious()
{
// get the current index and subtract 1
var index = Pages.IndexOf(CurrentPage) - 1;

//  /!\ Be aware that we have no check if the index is valid. You may want to add it on your own. /!\
CurrentPage = Pages[index];
}
}
}
Пример HomeViewModel:

Код: Выделить всё

using ReactiveUI;
using System;

namespace InfiniteConnect.ViewModels;

public class HomeViewModel : PageViewModelBase
{
public string Title => "Welcome to our Wizard-Sample.";

/// 
/// The content of this page
/// 
public string Message => "Press \"Next\" to register yourself.";

// This is our first page, so we can navigate to the next page in any case
public override bool CanNavigateNext
{
get => true;
protected set => throw new NotSupportedException();
}

// You cannot go back from this page
public override bool CanNavigatePrevious
{
get => false;
protected set => throw new NotSupportedException();
}
}
Я пытался поставить

Код: Выделить всё

await Dispatcher.UIThread.InvokeAsync(() => {});
вокруг разделов, где я переопределяю CurrentPage, или в наборе CurrentPage.
Я относительно новичок в C#, поэтому любые советы или ответы, почему это происходящее будет оценено по достоинству. Это разрабатывается в Rider.
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/790 ... read-error
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»