Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 递归调用主线程块_C#_Delegates_Xamarin.ios - Fatal编程技术网

C# 递归调用主线程块

C# 递归调用主线程块,c#,delegates,xamarin.ios,C#,Delegates,Xamarin.ios,我想知道,对于递归调用(Begin)InvokeOnMainThread调用的情况,建议采用什么方法来处理 情况是这样的。。。我有一个UI按钮,按下它可以启动下载,下载会启动音频播放,音频播放会更改UI 代码如下所示: void ButtonPressHandler(object sender, EventArgs args) { BeginInvokeOnMainThread(()=> { StartDownload(CompletionHandler); }); }

我想知道,对于递归调用(Begin)InvokeOnMainThread调用的情况,建议采用什么方法来处理

情况是这样的。。。我有一个UI按钮,按下它可以启动下载,下载会启动音频播放,音频播放会更改UI

代码如下所示:

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中执行此操作。这可能是造成问题的原因。