1

我想知道处理递归调用 (Begin)InvokeOnMainThread 调用的情况的推荐方法是什么。

场景是这样的......我有一个 UI 按钮按下启动下载,下载启动音频播放,音频播放更改 UI。

代码看起来像这样:

void ButtonPressHandler(object sender, EventArgs args)
{
    BeginInvokeOnMainThread(()=> {
    StartDownload(CompletionHandler);
 });
}

void CompletionHandler()
{
 BeginInvokeOnMainThread(()=> {
    StartPlayback(PlaybackFinished);
 });
}


void PlaybackFinished()
{
 BeginInvokeOnMainThread(()=> {
    UpdateUI();
 });
}

处理这种情况的推荐方法是什么?我的用户界面没有更新。我尝试了 BeginInvokeOnMainThread 和 InvokeOnMainThread。会不会出现死锁情况?

任何帮助表示赞赏。

4

3 回答 3

0

这可能不是“递归” BeginOnMainThread 调用的问题,而是其他问题。以下是一些检查提示:

  • UpdateUI 真的被调用了吗?
  • 如果您为流程中的每个步骤调用 UpdateUI,会发生什么?它在哪里停止工作?
  • 如果您从 ButtonPressHandler 调用 UpdateUI,它是否真的有效?
于 2012-09-10T09:10:30.353 回答
0

我能够让它工作。在下载完成时,我使用了 tableview 的 row.GetActiveCell 来更新 UI。与即使我执行 SetNeedsDisplay 也没有更改 UI 的 GetCell 相比,这似乎有效。不知道有什么区别。

于 2012-09-28T13:37:59.440 回答
0

InvokeOnMainThread 将暂停线程的执行,并等待委托在主线程上执行。完成后,线程恢复执行。BeginInvokeOnMainThread 没有。

你有没有尝试过这样的事情?

void ButtonPressHandler(object sender, EventArgs args)
{
    if (NSThread.Current.IsMainThread)
        StartDownload(CompletionHandler);
    else
        BeginInvokeOnMainThread(() => StartDownload(CompletionHandler););        
}

...等等其他方法。

于 2015-11-12T18:50:53.777 回答