- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的代码中,我有一个名为“ShowMessageBoxAsync”的任务。我想使用此代码向用户显示(并等待)DisplayAlert 并返回结果。像这样: var messageBoxResult = await View.ShowMessageBoxAsync("这是一个错误");
ShowMessageBoxAsync 的代码是:
public async System.Threading.Tasks.Task<bool> ShowMessageBoxAsync(string message)
{
var result = false;
Device.BeginInvokeOnMainThread(async () =>
{
result = await DisplayAlert("Error", message, "OK", "Cancel");
});
return result;
}
在我添加 Device.BeginInvokeOnMainThread 之前,任务给了我一个异常,它没有在主/UI 线程上运行。所以在添加了BeginInvokeOnMainThread之后,就开始正常工作了,没有异常。然而,问题是代码直接转到结果,而不等待“await DisplayAlert”的结果。
是否只有在 Device.BeginInvokeOnMainThread 代码完成后才返回“result”的值?
我对此做了一些研究,有人建议使用 TaskCompletionSource,但这会阻塞 UI 线程并且 DisplayAlert 根本不会显示。
最佳答案
I did some research about it and someone suggested to use a TaskCompletionSource
这是正确的解决方案。 TaskCompletionSource
充当 Task
的“完成者”。在这种情况下,此 Task
代表用户交互,因此您希望 UI 线程上的代码完成 Task
,而后台线程上的代码(a)等待“任务”。
所以,像这样:
public Task<bool> ShowMessageBoxAsync(string message)
{
var tcs = new TaskCompletionSource<bool>();
Device.BeginInvokeOnMainThread(async () =>
{
try
{
var result = await DisplayAlert("Error", message, "OK", "Cancel");
tcs.TrySetResult(result);
}
catch (Exception ex)
{
tcs.TrySetException(ex);
}
});
return tcs.Task;
}
这应该可以让您暂时畅通无阻。但是,更好的长期解决方案是让您的后台线程逻辑采用某种“与 UI 交互”的界面,如下所示:
public interface IAskUser
{
Task<bool> AskUserAsync(string message);
}
使用与上述类似的特定于 Xamarin Forms 的实现。
这样一来,您的后台线程逻辑就不会绑定(bind)到特定的 UI,并且可以更轻松地进行单元测试和重用。
关于c# - 是否可以等待 Device.BeginInvokeOnMainThread 代码完成(使用 UI 调用的结果继续后台工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54573940/
我有一个可以运行的应用程序,但是当我在我的 iPhone 上调试一段时间后,它挂断了电话,我可以恢复的唯一方法是硬重置侧面的按钮和主页按钮。 首先,会不会是因为我的应用程序有内存泄漏? 这是应用程序的
此代码未显示 DisplayAlert public MainPage() { InitializeComponent(); DisplayAlert("Hey", "Welcome"
我熟悉使用 Device.BeginInvokeOnMainThread 在 UI 线程上更新 UI 元素的规则,但是我有一个操作需要在 UI 线程上运行,它实际上是一个任务。 例如,XLabs.Fo
对不起,我敢肯定会变成一个非常愚蠢的问题.. 我在 Xamarin 应用程序中使用 Android UI 而不是 Xamarin Forms 作为表示层,但我想使用 Activity.RunOnUIT
我将以下代码包含在 private async Task 的签名方法中.我的问题是 ObservableCollection goods = new ObservableCollection();在下
在我的代码中,我有一个名为“ShowMessageBoxAsync”的任务。我想使用此代码向用户显示(并等待)DisplayAlert 并返回结果。像这样: var messageBoxResult
我正在将我现有的 (swift) iOS 物理治疗应用程序“On My Nerves”重写为 Xamarin.Forms。这是一个计时器应用程序,可以帮助神经受损的人(比如我!)进行脱敏练习。你有这些
我是一名优秀的程序员,十分优秀!