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

标签 c# ios multithreading xamarin

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

第一个 View Controller

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

            tableItems.Add(arrayContent [1, i]);
            tableSubtitles.Add(  arrayContent [5,i]);

            Dates.Add(tableItems[i]);
            Descriptions.Add (tableSubtitles [i]);

        }
        var calendarDetailController = segue.DestinationViewController as CalendarDetailVController;


        if (calendarDetailController != null) {
            Console.WriteLine ("preparesegue"+Dates.Count);
            calendarDetailController.Dates = Dates;
            calendarDetailController.Descriptions = Descriptions;
            calendarDetailController.TableTitle = text;
            calendarDetailController.id = id;
        }

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

第二个 View Controller

我只是获取给定的数据,例如

    public List<String> Dates { get; set; }
    public CalendarViewController (IntPtr handle) : base (handle)
    {
        Dates = new List<String> ();
    }

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

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


        TableView.ReloadData ();

     }

有时,如果 ViewDidLoad() 被触发,则在异步任务完成后,这会起作用。但我需要在数据完全到达时触发重新加载。你明白我的问题吗?感谢您的帮助。

最佳答案

你传递你的任务而不是任务的结果怎么样?

更改:

public List<String> Dates { get; set; }

致:

public Task<String[,]> DatesTask{get;set;}

然后您在第二个 View Controller 的 viewDidAppaer 中执行任务:

    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(() => {
                   InvokeOnMainThread (delegate {  
                            TableView.ReloadData ();
                          });
                });
            });


     }

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

或者,如果您确实想在第一个 View Controller 中执行任务,则应该在执行 PrepareForSegue 之前执行您的任务。

关于c# - 在 C#/Xamarin 中等待线程完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26196852/

相关文章:

c# - 如何在与其可执行文件相同的文件夹中启动进程

ios - 尝试使用 Watch OS 2 发送图像时出现 WCErrorDomain 7013

ios - SwiftyJSON 并添加到现有 [String : AnyObject] dictionary

c# - WPF C# - 从另一个线程编辑列表框

java - synchronized 关键字没有锁定链表,其他线程仍在从中轮询对象

c# - 找不到引用 Microsoft.DirectX.AudioVideoPlayback 和 Microsoft.DirectX

c# - 使用C#lambdas组合List <int>和int

C# 构造函数基关键字

ios - Swift:如何设置在 CAKeyFrameAnimation 完成时发生的 Action

java - 带处理程序的顺序倒计时器将无法正确更新 textView