Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# 线程问题-Web服务完成之前的UI更新_C#_Multithreading_Xamarin.android - Fatal编程技术网

C# 线程问题-Web服务完成之前的UI更新

C# 线程问题-Web服务完成之前的UI更新,c#,multithreading,xamarin.android,C#,Multithreading,Xamarin.android,我已经搜索了关于如何修复的示例 下面的问题,但似乎找不到我需要的,它开始 开车送我去厕所 本质上,我有一个竞争条件,即Web服务正在以一种方式完成 返回给UI之后,UI不会显示任何内容 一点也不 这是密码。Web服务确实获得了正确的数据 这一切的痛苦!generateNewScreen方法是 单击ListView区域上的某些文本 调用例程 private void generateNewScreen(int t) { string[] races = new string[] { };

我已经搜索了关于如何修复的示例 下面的问题,但似乎找不到我需要的,它开始 开车送我去厕所

本质上,我有一个竞争条件,即Web服务正在以一种方式完成 返回给UI之后,UI不会显示任何内容 一点也不

这是密码。Web服务确实获得了正确的数据 这一切的痛苦!
generateNewScreen
方法是 单击ListView区域上的某些文本

调用例程

private void generateNewScreen(int t)
{
    string[] races = new string[] { };
    View currentview = FindViewById<View>(Resource.Id.relLayout);
    TextView text = FindViewById<TextView>(Resource.Id.textTitle);
    ListView listView = FindViewById<ListView>(Resource.Id.listView);
    ImageView image = FindViewById<ImageView>(Resource.Id.imgBack);
    image.Visibility = ViewStates.Visible;

    Console.WriteLine("t = {0}, addFactor = {1}", t,addFactor);

    switch (addFactor)
    {
        case 0: 
            switch (t)
            {
                case 0: races =listviewInfo(Resource.Array.RaceTracks,
                    Resource.Drawable.Back_RaceHorsePlace, Resource.String.Tracks);
                    addFactor = 10;
                    break;

                case 1: List<string> 
                    race = new List<string>();                                                  
                    currentview.SetBackgroundDrawable(Resources.GetDrawable(Resource.Drawable.Back_BobMoore));
                    text.Text = Resources.GetString(Resource.String.ComingSoon);
                    webservice_user getRace = new webservice_user();
                    race = getRace.getUpcomingRaces("RP");
                    races = race.ToArray();
                    addFactor = 20;
                    break;
            }

            if (t < 6 || t == 7)
                listView.Adapter = new ArrayAdapter<string>(this, Resource.Layout.listview_layout, races);
            break;
    }
}
private string rTrack;

public List<string> getUpcomingRaces(string track)
{
    List<string> f = new List<string>();
    rTrack = track;
    getUpcomingRacesCallBack((list) =>
    {
        f = list;
    });
    return f;
}

private void getUpcomingRacesCallBack(Action<List&lt;string>> callback)
{
    List<string> f = new List<string>();

    if (checkForNetwork(true) != true)
    {
        f.Add("No network available");
        callback(f);
    }
    else
    {
        List<POHWS.webservice.UpcomingRaces> tableData = new List<POHWS.webservice.UpcomingRaces>();
        POHWS.webservice.Service1 Service3 = new POHWS.webservice.Service1();
        try
        {
            Service3.BeginGetUpcomingRacesList(rTrack, delegate(IAsyncResult iar)
            {
                tableData = Service3.EndGetUpcomingRacesList(iar).ToList();
                Android.App.Application.SynchronizationContext.Post(delegate
                {
                    if (tableData.Count == 0)
                    {
                        f.Add("No Upcoming Races Found within the next 7 days");
                        callback(f);
                    }
                    else
                    {
                        for (int i = 0; i < tableData.Count;++i)
                            f.Add(tableData[i].PostTime);
                        callback(f);
                    }
                }, null);
            }, null);
        }
        catch (Exception oe)
        {
            f.Add(oe.ToString());
            callback(f);
        }
    }
}
private void generateNewScreen(int t)
{
字符串[]种族=新字符串[]{};
View currentview=FindViewById(Resource.Id.relLayout);
TextView text=findviewbyd(Resource.Id.textTitle);
ListView ListView=FindViewById(Resource.Id.ListView);
ImageView image=findviewbyd(Resource.Id.imgBack);
image.Visibility=ViewStates.Visible;
WriteLine(“t={0},addFactor={1}”,t,addFactor);
开关(附加系数)
{
案例0:
开关(t)
{
案例0:races=listviewInfo(Resource.Array.racetraces,
Resource.Drawable.Back_赛马场,Resource.String.Tracks);
加法系数=10;
打破
案例1:清单
race=新列表();
currentview.SetBackgroundDrawable(Resources.GetDrawable(Resource.Drawable.Back_BobMoore));
text.text=Resources.GetString(Resource.String.ComingSoon);
webservice_user getRace=新的webservice_user();
种族=getRace.getUpcomingRaces(“RP”);
races=race.ToArray();
加法系数=20;
打破
}
如果(t<6 | | t==7)
Adapter=newarrayadapter(这个,Resource.Layout.listView\u布局,races);
打破
}
}
Webservice

private void generateNewScreen(int t)
{
    string[] races = new string[] { };
    View currentview = FindViewById<View>(Resource.Id.relLayout);
    TextView text = FindViewById<TextView>(Resource.Id.textTitle);
    ListView listView = FindViewById<ListView>(Resource.Id.listView);
    ImageView image = FindViewById<ImageView>(Resource.Id.imgBack);
    image.Visibility = ViewStates.Visible;

    Console.WriteLine("t = {0}, addFactor = {1}", t,addFactor);

    switch (addFactor)
    {
        case 0: 
            switch (t)
            {
                case 0: races =listviewInfo(Resource.Array.RaceTracks,
                    Resource.Drawable.Back_RaceHorsePlace, Resource.String.Tracks);
                    addFactor = 10;
                    break;

                case 1: List<string> 
                    race = new List<string>();                                                  
                    currentview.SetBackgroundDrawable(Resources.GetDrawable(Resource.Drawable.Back_BobMoore));
                    text.Text = Resources.GetString(Resource.String.ComingSoon);
                    webservice_user getRace = new webservice_user();
                    race = getRace.getUpcomingRaces("RP");
                    races = race.ToArray();
                    addFactor = 20;
                    break;
            }

            if (t < 6 || t == 7)
                listView.Adapter = new ArrayAdapter<string>(this, Resource.Layout.listview_layout, races);
            break;
    }
}
private string rTrack;

public List<string> getUpcomingRaces(string track)
{
    List<string> f = new List<string>();
    rTrack = track;
    getUpcomingRacesCallBack((list) =>
    {
        f = list;
    });
    return f;
}

private void getUpcomingRacesCallBack(Action<List&lt;string>> callback)
{
    List<string> f = new List<string>();

    if (checkForNetwork(true) != true)
    {
        f.Add("No network available");
        callback(f);
    }
    else
    {
        List<POHWS.webservice.UpcomingRaces> tableData = new List<POHWS.webservice.UpcomingRaces>();
        POHWS.webservice.Service1 Service3 = new POHWS.webservice.Service1();
        try
        {
            Service3.BeginGetUpcomingRacesList(rTrack, delegate(IAsyncResult iar)
            {
                tableData = Service3.EndGetUpcomingRacesList(iar).ToList();
                Android.App.Application.SynchronizationContext.Post(delegate
                {
                    if (tableData.Count == 0)
                    {
                        f.Add("No Upcoming Races Found within the next 7 days");
                        callback(f);
                    }
                    else
                    {
                        for (int i = 0; i < tableData.Count;++i)
                            f.Add(tableData[i].PostTime);
                        callback(f);
                    }
                }, null);
            }, null);
        }
        catch (Exception oe)
        {
            f.Add(oe.ToString());
            callback(f);
        }
    }
}
私有字符串rTrack;
公共列表getUpcomingRaces(弦乐)
{
列表f=新列表();
rTrack=轨道;
GetUpComingRacescalBack((列表)=>
{
f=列表;
});
返回f;
}
私有void GetUpComingRacescalBack(操作>回调)
{
列表f=新列表();
if(checkForNetwork(true)!=true)
{
f、 添加(“无可用网络”);
撤回(f);
}
其他的
{
List tableData=新列表();
POHWS.webservice.Service1 Service3=新的POHWS.webservice.Service1();
尝试
{
服务3.BeginGetUpcomingRacesList(rTrack,代表(IAsyncResult iar)
{
tableData=Service3.EndGetUpcomingRacesList(iar.ToList();
Android.App.Application.SynchronizationContext.Post(委托
{
如果(tableData.Count==0)
{
f、 添加(“在接下来的7天内没有发现即将到来的比赛”);
撤回(f);
}
其他的
{
对于(int i=0;i
是否可以停止UI或延迟更新,直到Web服务启动
你做了它需要的吗?我尝试了很多方法,但都没有成功。

这里的问题是
getUpcomingRaces()
的调用就像对
getupcomingRacescalBack()
的调用是同步的一样,并立即返回列表。因为lambda不太可能在return语句之前触发,所以它总是返回空列表

我建议重新构造代码,使其仅在返回后对列表起作用,类似于您使用
getupComingRacescalBack()
方法所采取的方法,该方法采用
操作

如果有帮助的话,我有一个示例项目来演示如何使用此模式。我还介绍了一些不同的方法来完成UI线程下的工作,以防最终实现调用同步