Xamarin:如何在 UI 线程上执行 long-运行 操作时让 UI 重绘(不使用 async/await)
Xamarin: How to let UI redraw while performing long-running operation on UI thread (without the use of async/await)
我(出于某种原因)被迫在我的 xamarin forms (NetStandard) 应用程序的 UI 线程上执行长 运行 操作。在此操作期间,我想更新 UI 以向用户反馈进度。我可以更改 UI,但是 UI 不会重绘,因为我不能 return 使用 await/async 指向 OS 的指令指针。
有什么方法可以在不使用 async/await 的情况下处理 UI 线程上的消息。在旧的 Win32 时代,我认为 Translate/DispatchMessage 可以用来保持消息泵在长时间 运行 操作中继续运行,这与我需要的类似。
背景:我有一个由 android OS 定义和调用的接口,它在我的 UI 线程上运行。重要的是,我们 return 来自该服务的这个 long-运行 操作的结果。因为接口没有定义为异步,所以我不能使用等待让 IP return 到 OS。如果我这样做,该函数将立即 return (没有获取结果)并继续执行(即,它会失败)。我无法改变这些情况。
// The following class is called directly by the AndroidOS
class CloudHostCardService : HostApduService
{
// The following method is called by the AndroidOS on the UI thread
public override byte[] ProcessCommandApdu(byte[] commandApdu, Bundle extras)
{
ViewModels.MainPageViewModel.SetStatus("Processing Cmd"); // <-- updates UI
return processor.ProcessCommand(commandApdu); // <-- Long running operation
}
}
有没有其他方法可以触发重绘(Win32 中的泵消息)?
HostApduService 允许您从 ProcessCommandApdu
return null
然后使用 SendResponseApdu 提供 ResponseApdu
.
This method is running on the main thread of your application. If you cannot return a response APDU immediately, return null and use the sendResponseApdu(byte[]) method later.
示例:
public class SampleHostApduService : HostApduService
{
public override void OnDeactivated([GeneratedEnum] DeactivationReason reason)
{
}
public override byte[] ProcessCommandApdu(byte[] commandApdu, Bundle extras)
{
// Update your UI via your viewmodel.
// Fire and forget
Task.Run(() => {
this.SendResponseApdu(processor.ProcessCommand(commandApdu));
});
// Return null as we handle this using SendResponseApdu
return null;
}
}
我(出于某种原因)被迫在我的 xamarin forms (NetStandard) 应用程序的 UI 线程上执行长 运行 操作。在此操作期间,我想更新 UI 以向用户反馈进度。我可以更改 UI,但是 UI 不会重绘,因为我不能 return 使用 await/async 指向 OS 的指令指针。
有什么方法可以在不使用 async/await 的情况下处理 UI 线程上的消息。在旧的 Win32 时代,我认为 Translate/DispatchMessage 可以用来保持消息泵在长时间 运行 操作中继续运行,这与我需要的类似。
背景:我有一个由 android OS 定义和调用的接口,它在我的 UI 线程上运行。重要的是,我们 return 来自该服务的这个 long-运行 操作的结果。因为接口没有定义为异步,所以我不能使用等待让 IP return 到 OS。如果我这样做,该函数将立即 return (没有获取结果)并继续执行(即,它会失败)。我无法改变这些情况。
// The following class is called directly by the AndroidOS
class CloudHostCardService : HostApduService
{
// The following method is called by the AndroidOS on the UI thread
public override byte[] ProcessCommandApdu(byte[] commandApdu, Bundle extras)
{
ViewModels.MainPageViewModel.SetStatus("Processing Cmd"); // <-- updates UI
return processor.ProcessCommand(commandApdu); // <-- Long running operation
}
}
有没有其他方法可以触发重绘(Win32 中的泵消息)?
HostApduService 允许您从 ProcessCommandApdu
return null
然后使用 SendResponseApdu 提供 ResponseApdu
.
This method is running on the main thread of your application. If you cannot return a response APDU immediately, return null and use the sendResponseApdu(byte[]) method later.
示例:
public class SampleHostApduService : HostApduService
{
public override void OnDeactivated([GeneratedEnum] DeactivationReason reason)
{
}
public override byte[] ProcessCommandApdu(byte[] commandApdu, Bundle extras)
{
// Update your UI via your viewmodel.
// Fire and forget
Task.Run(() => {
this.SendResponseApdu(processor.ProcessCommand(commandApdu));
});
// Return null as we handle this using SendResponseApdu
return null;
}
}