菜鸟教程小白 发表于 2022-12-13 09:33:10

c# - 等待线程在 c#/Xamarin 中完成


                                            <p><p>我在这里遇到了一件棘手的事情。我目前正在使用 Xamarin 开发 iOS 应用程序。 (我认为,如果您不了解 xamarin 但 c#,您可能也知道答案 - 它基本上是线程问题!)我有一个包含多个条目的表,当用户单击其中一个条目时,它是必需的我从网络服务加载数据。然后,此数据显示在第二个表中,该表显示了我推送到的另一个 View 。问题是:在用户单击表格条目的那一刻,触发了对另一个 View 的推送,那里的 viewDidLoad() 也被触发,我在其中设置了表格条目。但是现在有时会出现上一个 View 中的异步网络任务没有完成,从而使表为空。总结一下:在异步网络请求完成工作后,我需要在我推送到的 View 上触发 Table.Reload()。我怎么做?我真的被困在这里了。以下是我的代码的一些细节:</p>

<p><strong>第一个 ViewController </strong></p>

<pre><code>    public async override void PrepareForSegue (UIStoryboardSegue segue, NSObject sender)
    {
      //Sends the titles, subtitles, and the Headline to the DetailView
      base.PrepareForSegue (segue, sender);
      ...
      Task&lt;String[,]&gt; getJsonDataTask = SearchRequest.searchRequest (text, &#34;Calendar&#34;);
      arrayContent = await getJsonDataTask;
      ...
      for (int i = 0; i &lt; 50; i++) {

            tableItems.Add(arrayContent );
            tableSubtitles.Add(arrayContent );

            Dates.Add(tableItems);
            Descriptions.Add (tableSubtitles );

      }
      var calendarDetailController = segue.DestinationViewController as CalendarDetailVController;


      if (calendarDetailController != null) {
            Console.WriteLine (&#34;preparesegue&#34;+Dates.Count);
            calendarDetailController.Dates = Dates;
            calendarDetailController.Descriptions = Descriptions;
            calendarDetailController.TableTitle = text;
            calendarDetailController.id = id;
      }
</code></pre>

<p>所以我在这里启动一个异步线程(它需要通过异步。因为它是一个网络请求)
我正在将数据传输到我推送到的 ViewController 。
在</p>

<p><strong>第二个 ViewController </strong></p>

<p>我只是获取给定的数据,例如</p>

<pre><code>    public List&lt;String&gt; Dates { get; set; }
    public CalendarViewController (IntPtr handle) : base (handle)
    {
      Dates = new List&lt;String&gt; ();
    }
</code></pre>

<p>然后我在 ViewDidLoad() 中重新加载表格数据;</p>

<pre><code>      public override async void ViewDidAppear (bool animated)
    {
      base.ViewDidAppear (animated);
      //as the resource loading is async. whe need to refresh table here


      TableView.ReloadData ();

   }
</code></pre>

<p>有时,如果这个 ViewDidLoad() 被触发,在异步任务完成后,它会起作用。但是我需要在数据完全到达时触发重新加载。你明白我的问题吗?感谢您的帮助。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>你传递你的任务而不是任务的结果怎么样?</p>

<p>变化:</p>

<pre><code>public List&lt;String&gt; Dates { get; set; }
</code></pre>

<p>收件人:</p>

<pre><code>public Task&lt;String[,]&gt; DatesTask{get;set;}
</code></pre>

<p>然后您在第二个 ViewController 的 viewDidAppaer 中执行任务:</p>

<pre><code>    public override async void ViewDidAppear (bool animated)
    {
      base.ViewDidAppear (animated);
                //as the resource loading is async. whe need to refresh table here

Task.Run (async delegate {
                await DatesTask().ContinueWith(() =&gt; {
                   InvokeOnMainThread (delegate {
                            TableView.ReloadData ();
                        });
                });
            });


   }
</code></pre>

<p>我不建议让 ViewDidAppaer 等方法等待,而是让任务处理您的方法的执行,一旦完成,让您的 tableview 刷新。这样你就不会在执行任务时卡住你的用户界面! </p>

<p>或者如果你真的想在你的第一个 ViewController 中执行你的任务,你应该在执行 <code>PrepareForSegue</code> 之前执行你的任务。</p></p>
                                   
                                                <p style="font-size: 20px;">关于c# - 等待线程在 c#/Xamarin 中完成,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/26196852/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/26196852/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: c# - 等待线程在 c#/Xamarin 中完成