【发布时间】:2019-12-18 19:05:29
【问题描述】:
我想异步显示项目列表,我正在执行如下操作,但我不确定它是否正常工作。你们能帮帮我吗,这是正确的方法吗?
private List<SuggestedItemsInput> SuggestedItemAsync()
{
OHDWebService OHDService = new OHDWebService();
List<SuggestedItemsInput> suggestedItemsList = OHDService.SaveSuggestedItems(hdnPlainBody.Value, hfdOrderRecordID.Value);
return suggestedItemsList;
}
private async void GetSuggestedItemsFromService()
{
Task<List<SuggestedItemsInput>> task = new Task<List<SuggestedItemsInput>>(SuggestedItemAsync);
task.Start();
List<SuggestedItemsInput> suggestedItems = await task;
ViewState["sItems"] = suggestedItems;
if (suggestedItems != null && suggestedItems.Count > 0)
{
GetSuggestedItems(Request["OrderRecordID"].ToString());
lblInfo.Text = string.Empty;
}
}
编辑: 现在我使用下面的代码它正在工作,我正在通过 SaveAndGetSuggestedItem() 方法保存和获取数据。将数据保存在数据库中需要时间,同时我想在完成后显示加载图像加载图像应该隐藏并且数据应该填充在网格视图中,我在下面添加了代码,但问题是网格视图手动刷新页面后会加载,加载图片会持续显示。
/// <summary>
/// Gets the SuggestedItems from API.
/// </summary>
private List<SuggestedItemsInput> SaveAndGetSuggestedItem()
{
try
{
OHDWebService OHDService = new OHDWebService();
return OHDService.SaveSuggestedItems(hdnPlainBody.Value, hfdOrderRecordID.Value);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// Async call to the SuggestedItems.
/// </summary>
private async Task GetSuggestedItemsAsync()
{
try
{
LoadingImg.Visible = true;
List<SuggestedItemsInput> suggestedItems = await Task.Run(() => SaveAndGetSuggestedItemFromKenome());
LoadingImg.Visible = false;
ViewState["sItems"] = suggestedItems;
if (suggestedItems != null && suggestedItems.Count > 0)
{
BindSuggestedItems(hfdOrderRecordID.Value);
lblInfo.Text = string.Empty;
}
}
catch (Exception ex)
{
throw ex;
}
}
首页(查看):
<asp:Panel ID="LoadingImg" runat="server" Visible="false">
<i class="fa fa-spinner fa-pulse fa-3x fa-fw" style="color: darkblue"></i>
<span class="sr-only">Loading...</span><span>Please wait...</span>
</asp:Panel>
<asp:Label ID="lblInfo" runat="server"></asp:Label>
<asp:GridView ID="grdSuggestedItems" runat="server" CellPadding="4" CellSpacing="4" AutoGenerateColumns="false" Width="100%" CssClass="table" HorizontalAlign="Center">
<HeaderStyle HorizontalAlign="Center" BackColor="#8b6f4e" ForeColor="white" />
<Columns>
<asp:BoundField HeaderText="Matched Text" DataField="MessageText" />
<asp:TemplateField HeaderText="ItemId">
<ItemTemplate>
<div>
<span style="font-size: 12px;">
<a target="_blank" style="cursor: pointer" href='<%= ConfigurationManager.AppSettings["InvInquiry"].ToString() %><%#Eval("ItemID") %>'><%#Eval("ItemID") %></a>
</span>
<div style="font-size: 10px;">
<%#Eval("ItemDescription") %>
</div>
</div>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="ProductLine" DataField="ProductLine" />
<asp:BoundField HeaderText="Qty" DataField="Qty" />
<asp:BoundField HeaderText="Confidence(%)" DataField="Confidence" />
<asp:BoundField HeaderText="Rank" DataField="Rank" />
</Columns>
<RowStyle HorizontalAlign="Center" />
</asp:GridView>
【问题讨论】:
-
您希望在这里发生什么?顺便说一句,除非您正在编写事件处理程序,否则不要使用
async void。 -
我的整个页面有很多回发事件,因为我想异步加载gridview。在单击事件 GetSuggestedItemsFromService 上,此方法将调用并保存数据,之后我会将其绑定到 gridview。这将花费大约 20 到 30 秒,所以如果应用 asyn await 我可以同时做其他工作
-
你看microsoft guide了吗?我认为您可以通过首先阅读一些文章和教程来了解
async/await。此外,在提出问题时,请包括当前正在发生的事情以及您希望发生的事情。 -
私有异步 void GetSuggestedItemsFromService()-> 私有异步任务 GetSuggestedItemsFromService()
-
如果你把
OHDService.SaveSuggestedItems(...)也设为异步会更好
标签: c# asp.net multithreading async-await