C# 线程问题-Web服务完成之前的UI更新
我已经搜索了关于如何修复的示例 下面的问题,但似乎找不到我需要的,它开始 开车送我去厕所 本质上,我有一个竞争条件,即Web服务正在以一种方式完成 返回给UI之后,UI不会显示任何内容 一点也不 这是密码。Web服务确实获得了正确的数据 这一切的痛苦!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[] { };
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<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<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线程下的工作,以防最终实现调用同步