0

Выполнение метода останавливается на определенной строке, дальше не идет (причем, выполнение подобного метода в другом классе успешно).

public partial class ChatFormViewModel : BaseViewModel, IQueryAttributable
{
    public void ApplyQueryAttributes(IDictionary<string, object> query)
    {
        Dialog = query["Dialog"] as Models.Dialog;
    }
Command ShowProfile { get; set; }
Timer _timer;
Models.Dialog dialog;

public Models.Dialog Dialog
{
    get {
        Console.WriteLine($&quot;dialog.title: {dialog.Title}&quot;);
        return dialog; }
    set
    {
        dialog = value;
        OnPropertyChanged();
    }
}

public Command SendMessage { get; private set; }



private ObservableCollection&lt;MessageInChat&gt; _messages = new();
public bool isBackButtonVisible;
private string _newMessageText =&quot;&quot;;


public ObservableCollection&lt;MessageInChat&gt; Messages
{
    get =&gt; _messages;
    set
    {
        if (value != _messages)
        {
            _messages = value;
            OnPropertyChanged();
        }
    }
}

public string NewMessageText
{   
    get =&gt; _newMessageText;
    set
    {
        _newMessageText = value;
        OnPropertyChanged(nameof(NewMessageText));
    }
}


async Task UploadMessages() //проблема в этом методе
{
    IsLoading = true;
    if (!server.IsHasConnection())
    {
        IsLoading = false;
        IsHasNotConnection = true;
    }
    else
    {
        IsHasNotConnection = false;
        if (!server.IsHasMessages()) 
        {
            IsHasNotData = true;
            IsLoading = false;
        }
        //else
        {
            Console.WriteLine(&quot;Upload is running1&quot;); //есть в консоли
            IsHasNotData = false;
            Console.WriteLine(&quot;Upload is running2&quot;); //есть в консоли
            _messages.Clear();
            Console.WriteLine(&quot;Upload is running3&quot;); //есть в консоли
            List&lt;Models.Message&gt; list = server.GetDialog(dialog.DialogID); //предполагаю, что проблема в выполнении этого
            Console.WriteLine(&quot;Upload is running4&quot;); //этой и последующих строк в консоли нет
            Console.WriteLine($&quot;[Messages] List length: {list.Count}&quot;);
            foreach (var item in list)
            {
                MessageInChat message = new()
                {
                    SenderID = item.userId,
                    ID = item.messageId,
                    Message = item.message,
                    UserImage = item.imageResource,
                    MessageFrom = item.messageFrom,
                    timeSended = TimeToString(item.sendedAt),

                    GridColumnMessage = item.messageFrom ==
                        Constants.Server.MESSAGE_FROM_ANOTHER ? 1 : 0,
                    GridColumnImage = item.messageFrom ==
                        Constants.Server.MESSAGE_FROM_ANOTHER ? 0 : 1,
                    statusImage = getStatusImageResourceByMessageStatus(item.status),
                    HorizontalOption = item.messageFrom ==
                        Constants.Server.MESSAGE_FROM_ANOTHER ? &quot;start&quot; : &quot;end&quot;,
                    Background = item.messageFrom == Constants.Server.MESSAGE_FROM_ANOTHER ?
                        Color.FromRgb(234, 221, 248) : Color.FromRgb(240, 235, 245),
                };
                _messages.Add(message);
            }

            Messages = _messages;
            IsLoading = false;
            Console.WriteLine(&quot;Upload is ended&quot;);
            Console.WriteLine($&quot;Chats length: {_messages.Count}&quot;);
        }
    }
}

async Task init()
{
    Console.WriteLine(&quot;Checker init&quot;);
    if (server.IsHasNewMessages()) await UploadMessages(); // IsHasNew Messages возвращает false


}

Task Init { get; set; }

public ChatFormViewModel()
{
    Console.WriteLine(&quot;init viewmodel&quot;);

    _timer = new Timer(new TimerCallback(async (s) =&gt; await init()),
                  null, TimeSpan.Zero, TimeSpan.FromMilliseconds(300));
    Init = UploadMessages();
}

~ChatFormViewModel() =&gt; _timer.Dispose();

...}

GetDialog метод:

 public List<Models.Message> GetDialog(int dialogID)
    {
        Console.WriteLine("Method init"); //этой строки так же нет в консоли
        List<Models.Message> MsgList = new();
    MsgList.Add(new Models.Message()
    {
        userId = 0,
        messageId = 0,
        userName = &quot;Даниил&quot;,
        imageResource = &quot;user_no_image.png&quot;,
        message = &quot;Lorem ipsum dolor sit amet&quot;,
        messageFrom = Constants.Server.MESSAGE_FROM_ANOTHER,
        status = Constants.Server.MESSAGE_STATUS_NOTREADED,
        sendedAt = DateTime.Now,
    });

    MsgList.Add(new Models.Message()
    {
        userId = 0,
        messageId = 0,
        userName = &quot;Даниил&quot;,
        imageResource = &quot;user_no_image.png&quot;,
        message = &quot;Lorem ipsum dolor sit amet&quot;,
        messageFrom = Constants.Server.MESSAGE_FROM_CURRENT,
        status = Constants.Server.MESSAGE_STATUS_NOTREADED,
        sendedAt = DateTime.Now,
    });

    return MsgList;

}

Console:

[DOTNET] init viewmodel
[DOTNET] Checker init
[DecorView[]] pkgName:com.companyname.prodom.mobileclient old windowMode:0 new windoMode:1, isFixedSize:false
[MouseWheelSynthesizer] mMoveStepInDp: 64, mMoveStepInPixel: 192, mUpTimeDelayed: 100
[ViewRootImpl] ViewRootImpl mIsInProductivePCDisplay: false
[InputEventReceiver] dispatchInputInterval 1000000
[DOTNET] Upload is running1
[DOTNET] Upload is running2
[DOTNET] Upload is running3
[om.mobileclien] Explicit concurrent copying GC freed 8741(528KB) AllocSpace objects, 0(0B) LOS objects, 68% free, 2801KB/8945KB, paused 25us total 11.645ms
[DOTNET] dialog.title: Даниил
[HiTouch_HiTouchSensor] depended package hiTouch does n't exist!
[HiTouch_HiTouchSensor] HiTouch restricted: system app HiTouch don't exist.
[HiTouch_PressGestureDetector] onAttached, package=com.companyname.prodom.mobileclient, windowType=2, mIsHiTouchRestricted=true
[mali_winsys] EGLint new_window_surface(egl_winsys_display *, void *, EGLSurface, EGLConfig, egl_winsys_surface **, EGLBoolean) returns 0x3000
[DOTNET] Checker init
[DecorView] showOrHideHighlightView: hasFocus=false; winMode=1; isMrgNull=true
[DisplayEventDispatcher] dispatcher 0x72927983e0 ~ ignoring unknown event type 0x736f6674
[DOTNET] Checker init
[DOTNET] Checker init
Thread started: <Thread Pool> #11
[DOTNET] Checker init
[DOTNET] Checker init

Подскажите, пожалуйста, в чем может быть проблема? Спасибо

  • 1
    Отвыкайте использовать Console в UI приложениях, используйте Debug.WriteLine из System.Diagnostics – aepot Nov 20 '22 at 18:04
  • 1
    Какая-то каша: UploadMessages() объявлен как async, но он на самом деле синхронный. Далее стартует какой-то таймер, который вызывает этот же метод, далее этот же метод вызывается из конструктора вместе со стартом таймера. Зачем это всё, когда есть async/await? И вишенка на торте - вызов Dispose() таймера в финализаторе класса, никогда так не делайте. Финализатор не для этого существует, удалите его совсем. – aepot Nov 20 '22 at 18:15
  • 1
    https://ru.stackoverflow.com/a/1257322/373567 вот вам вместо таймера – aepot Nov 20 '22 at 18:16
  • 1
    https://ru.stackoverflow.com/a/1430395/373567 вариант решения проблемы невозможности вызова асинхронных операций в конструкторе – aepot Nov 20 '22 at 18:19
  • 1
    https://ru.stackoverflow.com/a/1138718/373567 про финализаторы – aepot Nov 20 '22 at 18:20
  • 1
    А происходящую "магию" можно объяснить например дедлоком. Но вследствие того что весь код видите только вы, а внутреннее поведение MAUI даже самому майкрософту не до конца известно, найти первопричину происходящего не представляется возможным. Объявите синхронное синхронным, избавьтесь от async void в обработчике таймера, заверните критичный код в try-catch, и можно будет дальше покопаться. И уберите Console отовсюду. – aepot Nov 20 '22 at 18:26
  • @aepot, спасибо большое, учту! – StudyAndroid Nov 20 '22 at 19:05

0 Answers0