我怎樣才能在從網路服務器獲取資料時使影像旋轉呢?
private async void FetchDataAsync(object sender, EventArgs e)
{
ImageBox.IsVisible = true。
rotation = new Animation(v => ImageBox. Rotation = v, 0, -360)。)
旋轉。 Commit(this, "rotate" , 5, 1000, Easing. Linear, (v, c) => ImageBox. Rotation = 0, () => true) ;using (
var httpC = new HttpClient()
{
if (!string.IsNullOrEmpty(url))
{
var result = httpC.GetAsync(finalUrl).GetAwaiter().GetResult()。
var results = result.Content.ReadAsStringAsync();
.
.
.
.
.
等
}
}
}
如果我去掉客戶端的部分,影像就會完美地旋轉,所以旋轉是有效的,但為什么當我使用http客戶端獲取時,它就不作業了呢? 如何讓它在執行緒繁忙時運行?
因此,這里是編輯過的部分,經過一些研究,我設法讓它旋轉,并使用async和await......但現在,當它在后臺作業時,只要我觸摸手機螢屏,我就會得到這個錯誤 "只有創建視圖層次結構的原始執行緒可以觸摸其視圖。
private async void BtnOpenServicesPageClicked(object sender, EventArgs e)。
{
// Device.BeginInvokeOnMainThread(() => { RunRotation(); });
RunRotation();
DisbaleUI()。
var userName = TxtUserName.Text;
var password = TxtPassword.Text;
if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password))
{
await DisplayAlert("Missing Credentials", "User name and password are required fields", "OK")。
return。
}
var url = "The Url To Be USed";
var builder = new UriBuilder(url)。
builder.Port = 0000;
var query = HttpUtility.ParseQueryString(builder.Query)。
query["用戶名"] = "用戶名"。
query["password"] = "password";
builder.Query = query.ToString();
string finalUrl = builder.ToString();
var services=await Task.Run( () => RunHttpRequestAsync(finalUrl))。
var servicesPage= new ServicesMainPage(services);
EnableUI()。
await Navigation.PushModalAsync(new NavigationPage(obcMapsPage))。
}
private async Task<List<NNWServices>> RunHttpRequestAsync(string finalUrl)
{
var services = new List<NNWServices>()。
try
{
using (var httpC = new HttpClient()
{
if (!string.IsNullOrEmpty(finalUrl))
{
var result = httpC.GetAsync(finalUrl).Result;
var results = result.Content.ReadAsStringAsync()。
var responseDictionary = JsonConvert.DeserializeObject<Dictionary<string, object>>(results.Result)。
var userInfo = responseDictionary["user"]。
var allUSerInfo = JsonConvert.DeserializeObject<Dictionary<string, object>>(userInfo.ToString())。
var userNAme = allUSerInfo["UN"/span>].ToString()。
var passWord = allUSerInfo["PW"].ToString();
var item = responseDictionary["SINFO"].ToString();
var allServerInfo = JsonConvert.DeserializeObject<Dictionary<string, object>>( item)。
var servicesInside = allServerInfo["Services"].ToString()。
var crntSrvces = JsonConvert.DeserializeObject<List<NNWServices>>(servicesInside)。
foreach (var srv in crntSrvces)
{
srv.UserName = userNAme;
srv.Password = passWord;
}
services.AddRange(crntSrvces)。
}
}
}
catch (Exception ex)
{
this.AbortAnimation("rotate") 。
ImageBox.IsVisible = false。
return服務。
}
this.AbortAnimation("rotate"/span>)。
ImageBox.IsVisible = false。
return服務。
}
希望能得到任何幫助,我對Xamarin非常陌生
。uj5u.com熱心網友回復:
一般來說,Async voids被認為是一個禁區,因為它們是 "fire and forget",而不是正確的等待。如果你想確保你的方法被正確等待,你應該把它變成一個Task。你可以通過改變你的訂閱來使事件訂閱成為異步的,就像這樣;
view.OnButtonClicked = async (s, e) => await FetchDataAsync();
private async Task FetchDataAsync(object sender, EventArgs e)。
{
...
}
通常來說,異步事件是不受歡迎的,這時MVVM命令系結是首選,因為它們更適合呼叫異步代碼。
另外,這;
httpC.GetAsync(finalUrl).GetAwaiter().GetResult()。
這并不是很好。但無論如何,等待這個方法將消除對這段代碼的需求
更多關于為什么要把這個方法作為一種 "工具 "來使用?
這里列出了更多關于為什么不應該使用異步事件的資訊 - https://codereview.stackexchange.com/questions/133464/use-of-async-await-for-eventhandlers.
。編輯
關于您最新更新的標題,您之所以遇到這個問題,是因為您試圖從主執行緒以外的執行緒執行 UI 更新。如果您的 UI 是在一個等待中的任務中進行更新,您就不會出現這個問題。
我不希望鼓勵 "黑客 "代碼,因為你對之前問題的回答并不是很有執行緒效率,但是如果你希望在主UI執行緒上快速做出改變,你可以從XamarinEssentials庫中呼叫以下方法
MainThread.BeginInvokeOnMainThread(() =>
{
//運行在主執行緒上的代碼
});
https://docs.microsoft.com/en-us/xamarin/essentials/main-thread
uj5u.com熱心網友回復:
你應該使用一個活動指示器來做。活動指示器可以被系結到一個系結的影像源的狀態上
<ActivityIndicator Grid. Row="0" Grid. Column="0" IsVisible="True" BindingContext="{x。 Reference Name=image}" IsRunning="{Binding Path=IsLoading}" Color="Blue" />
<Image x: Name="image" Margin="0" HorizontalOptions="Center"/span> VerticalOptions="Center" Aspect="AspectFill" HeightRequest="40" WidthRequest="40" Source="{Binding Source}"> </Image>>
uj5u.com熱心網友回復:
我通過在一個單獨的方法中正確地運行HTTP請求異步,成功地讓它按照我的要求運行,沒有任何問題,解決方案如下。
private async void BtnOpenServicesPageClicked(object sender, EventArgs e)。
{
// Device.BeginInvokeOnMainThread(() => { RunRotation(); });
RunRotation();
DisbaleUI()。
var userName = TxtUserName.Text;
var password = TxtPassword.Text;
if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password))
{
await DisplayAlert("Missing Credentials", "User name and password are required fields", "OK")。
return。
}
var url = "The Url To Be USed";
var builder = new UriBuilder(url)。
builder.Port = 0000;
var query = HttpUtility.ParseQueryString(builder.Query)。
query["用戶名"] = "UserP123";
query["password"] = "P@$$WORD"。
builder.Query = query.ToString();
string finalUrl = builder.ToString();
var services=await Task.Run( () => RunHttpRequestAsync(finalUrl))。
var servicesPage= new ServicesMainPage(services);
EnableUI()。
await Navigation.PushModalAsync(new NavigationPage(obcMapsPage))。
}
private async Task<List<NNWServices>> RunHttpRequestAsync(string finalUrl)
{
var services = new List<NNWServices>()。
try
{
using (var httpC = new HttpClient()
{
if (!string.IsNullOrEmpty(finalUrl))
{
var result = httpC.GetAsync(finalUrl).Result;
var results = result.Content.ReadAsStringAsync()。
var responseDictionary = JsonConvert.DeserializeObject<Dictionary<string, object>>(results.Result)。
var userInfo = responseDictionary["user"]。
var allUSerInfo = JsonConvert.DeserializeObject<Dictionary<string, object>>(userInfo.ToString())。
var userNAme = allUSerInfo["UN"/span>].ToString()。
var passWord = allUSerInfo["PW"].ToString();
var item = responseDictionary["SINFO"].ToString();
var allServerInfo = JsonConvert.DeserializeObject<Dictionary<string, object>>( item)。
var servicesInside = allServerInfo["Services"].ToString()。
var crntSrvces = JsonConvert.DeserializeObject<List<NNWServices>>(servicesInside)。
foreach (var srv in crntSrvces)
{//設定每個Srvc的用戶名和密碼都是一樣的。
srv.UserName = userNAme;
srv.Password = passWord。
}
services.AddRange(crntSrvces)。
}
}
}
catch (Exception ex)
{
Logger.LogException("Exception Occurred",ex)。
return服務。
}
return services。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/312721.html
標籤:
