Выполнение метода останавливается на определенной строке, дальше не идет (причем, выполнение подобного метода в другом классе успешно).
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($"dialog.title: {dialog.Title}");
return dialog; }
set
{
dialog = value;
OnPropertyChanged();
}
}
public Command SendMessage { get; private set; }
private ObservableCollection<MessageInChat> _messages = new();
public bool isBackButtonVisible;
private string _newMessageText ="";
public ObservableCollection<MessageInChat> Messages
{
get => _messages;
set
{
if (value != _messages)
{
_messages = value;
OnPropertyChanged();
}
}
}
public string NewMessageText
{
get => _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("Upload is running1"); //есть в консоли
IsHasNotData = false;
Console.WriteLine("Upload is running2"); //есть в консоли
_messages.Clear();
Console.WriteLine("Upload is running3"); //есть в консоли
List<Models.Message> list = server.GetDialog(dialog.DialogID); //предполагаю, что проблема в выполнении этого
Console.WriteLine("Upload is running4"); //этой и последующих строк в консоли нет
Console.WriteLine($"[Messages] List length: {list.Count}");
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 ? "start" : "end",
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("Upload is ended");
Console.WriteLine($"Chats length: {_messages.Count}");
}
}
}
async Task init()
{
Console.WriteLine("Checker init");
if (server.IsHasNewMessages()) await UploadMessages(); // IsHasNew Messages возвращает false
}
Task Init { get; set; }
public ChatFormViewModel()
{
Console.WriteLine("init viewmodel");
_timer = new Timer(new TimerCallback(async (s) => await init()),
null, TimeSpan.Zero, TimeSpan.FromMilliseconds(300));
Init = UploadMessages();
}
~ChatFormViewModel() => _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 = "Даниил",
imageResource = "user_no_image.png",
message = "Lorem ipsum dolor sit amet",
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 = "Даниил",
imageResource = "user_no_image.png",
message = "Lorem ipsum dolor sit amet",
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
Подскажите, пожалуйста, в чем может быть проблема? Спасибо
Debug.WriteLineизSystem.Diagnostics– aepot Nov 20 '22 at 18:04UploadMessages()объявлен какasync, но он на самом деле синхронный. Далее стартует какой-то таймер, который вызывает этот же метод, далее этот же метод вызывается из конструктора вместе со стартом таймера. Зачем это всё, когда естьasync/await? И вишенка на торте - вызовDispose()таймера в финализаторе класса, никогда так не делайте. Финализатор не для этого существует, удалите его совсем. – aepot Nov 20 '22 at 18:15async voidв обработчике таймера, заверните критичный код вtry-catch, и можно будет дальше покопаться. И уберитеConsoleотовсюду. – aepot Nov 20 '22 at 18:26