C# 递归调用主线程块
我想知道,对于递归调用(Begin)InvokeOnMainThread调用的情况,建议采用什么方法来处理 情况是这样的。。。我有一个UI按钮,按下它可以启动下载,下载会启动音频播放,音频播放会更改UI 代码如下所示:C# 递归调用主线程块,c#,delegates,xamarin.ios,C#,Delegates,Xamarin.ios,我想知道,对于递归调用(Begin)InvokeOnMainThread调用的情况,建议采用什么方法来处理 情况是这样的。。。我有一个UI按钮,按下它可以启动下载,下载会启动音频播放,音频播放会更改UI 代码如下所示: void ButtonPressHandler(object sender, EventArgs args) { BeginInvokeOnMainThread(()=> { StartDownload(CompletionHandler); }); }
void ButtonPressHandler(object sender, EventArgs args)
{
BeginInvokeOnMainThread(()=> {
StartDownload(CompletionHandler);
});
}
void CompletionHandler()
{
BeginInvokeOnMainThread(()=> {
StartPlayback(PlaybackFinished);
});
}
void PlaybackFinished()
{
BeginInvokeOnMainThread(()=> {
UpdateUI();
});
}
处理这种情况的推荐方法是什么?我的UI没有得到更新。我尝试了BeginInvokeOnMainThread和InvokeOnMainThread。会出现僵局吗
非常感谢您的帮助。这可能不是“递归”BeginOnMainThread调用的问题,而是其他问题。以下是一些需要检查的提示:
- 我真的打过电话吗
- 如果为流程中的每个步骤调用UpdateUI,会发生什么?它在哪里停止工作
- 如果您从ButtonPressHandler调用UpdateUI,它实际工作吗
- 我能够让它工作。在下载完成中,我使用了tableview的row.GetActiveCell来更新UI。这似乎比GetCell更有效,GetCell即使设置了NeedsDisplay也没有改变UI。不确定区别是什么。InvokeOnMainThread将挂起线程的执行,并等待在主线程上执行委托。完成后,线程继续执行。
BeginInvokeOnMainThread没有
你试过这样的东西吗
void ButtonPressHandler(object sender, EventArgs args)
{
if (NSThread.Current.IsMainThread)
StartDownload(CompletionHandler);
else
BeginInvokeOnMainThread(() => StartDownload(CompletionHandler););
}
。。。其他方法也是如此。我的更新不需要在UITableViewCell中显示图像和文本。如果我在第一个主线程中这样做,它就会工作。如果我在InvokeOnMain线程内部调用它,它不会做任何事情。如果我执行tableview单元格更新,则无论InvokeOnMainThread如何,它都会工作。为了检查线程,我在更新UI函数中打印线程id,并且它总是返回UI线程。但是如果我在外部块中调用更新UI,更新可以工作,但在内部块中不工作。我有一个按钮,按下后会更新ui,然后创建webclient并异步启动下载。然后,下载完成后,需要再次更新ui。第一次更新有效,但第二次更新重置文本和按钮图像无效。我尝试过使用Performselector或CreateScheduledTimer,但没有任何效果。@VahidKowsari:您的场景应该可以工作,因此可能是代码的其他部分导致了这种行为。也许你可以试着创建一个小的测试项目来展示这个问题?谢谢Rolf。我做了一个小的测试应用程序,它测试了上面的功能,有一个启动按钮和一个UI更改标签,它似乎可以工作。此应用程序与我的真实应用程序之间的区别在于,我的应用程序在自定义UITableViewCell中执行此操作。这可能是造成问题的原因。