c#中的异步内存流方法以异步获取数据
我的仪表板需要太多时间才能从数据库获取数据,因此我必须使用c#中的异步内存流方法以异步获取数据,c#,asynchronous,C#,Asynchronous,我的仪表板需要太多时间才能从数据库获取数据,因此我必须使用async方法来处理此问题我的代码如下: public async Task < Stream > LoadDashboard() { Stream s = new MemoryStream(Encoding.Default.GetBytes(Resource.Dashboard)); s.Position = 0; return s; } private async void frmMaterialDas
async
方法来处理此问题我的代码如下:
public async Task < Stream > LoadDashboard() {
Stream s = new MemoryStream(Encoding.Default.GetBytes(Resource.Dashboard));
s.Position = 0;
return s;
}
private async void frmMaterialDashboard_Load(object sender, EventArgs e) {
Stream dashboardData = await LoadDashboard();
dashboardViewer1.LoadDashboard(dashboardData);
//show UI components for user interact
}
我想异步执行这个部分。加载表单时,我想调用LoadDashboard
作为后台任务,从数据库中获取数据,主线程显示我的用户界面表单
我正在使用的组件链接:
看起来您没有实际的异步工作可以做,您正在将资源读入内存流。将
async
关键字放在somthing上本身不起任何作用,函数仍然像以前一样运行。如果你想让工作发生在后台,你必须告诉它使用一个新线程在后台工作
//Get rid of this async stuff here.
public Stream LoadDashboard()
{
Stream s = new MemoryStream(Encoding.Default.GetBytes(Resource.Dashboard));
s.Position = 0;
return s;
}
private async void frmMaterialDashboard_Load(object sender, EventArgs e)
{
//Start LoadDashboad in a background thread and await it.
Stream dashboardData = await Task.Run(() => LoadDashboard());
dashboardViewer1.LoadDashboard(dashboardData);
//show UI components for user interact
}
另一种选择是不将字符串复制到内存流,而是直接获取该流
private void frmMaterialDashboard_Load(object sender, EventArgs e)
{
using (var dashboardStream = Resources.ResourceManager.GetStream("Dashboard"))
{
dashboardViewer1.LoadDashboard(dashboardStream);
}
//show UI components for user interact
}
我放弃了异步,因为据我所知DashboadViewer不提供从后台调用LoadDashboard的方法。您将不得不等待它完成加载,或者找出如何获取较小的数据。看起来您没有实际的异步工作可以做,您正在将资源读入内存流。将
async
关键字放在somthing上本身不起任何作用,函数仍然像以前一样运行。如果你想让工作发生在后台,你必须告诉它使用一个新线程在后台工作
//Get rid of this async stuff here.
public Stream LoadDashboard()
{
Stream s = new MemoryStream(Encoding.Default.GetBytes(Resource.Dashboard));
s.Position = 0;
return s;
}
private async void frmMaterialDashboard_Load(object sender, EventArgs e)
{
//Start LoadDashboad in a background thread and await it.
Stream dashboardData = await Task.Run(() => LoadDashboard());
dashboardViewer1.LoadDashboard(dashboardData);
//show UI components for user interact
}
另一种选择是不将字符串复制到内存流,而是直接获取该流
private void frmMaterialDashboard_Load(object sender, EventArgs e)
{
using (var dashboardStream = Resources.ResourceManager.GetStream("Dashboard"))
{
dashboardViewer1.LoadDashboard(dashboardStream);
}
//show UI components for user interact
}
我放弃了异步,因为据我所知DashboadViewer不提供从后台调用LoadDashboard的方法。您必须等待它完成加载,或者找出如何获取较小的数据。定义“不工作”。到底是什么问题?旁注:
MemoryStream
没有异步功能。。。非常不清楚使用async
标记完全同步的LoadDashboard函数的期望值。您的代码在同步模式下查询数据库。改用FirstAsync。内存流什么也不做asynchronous@AlexeiLevenkov我只想在LoadDashboard函数中异步加载数据,并允许我的用户与我的ui(菜单)交互,但您认为这段代码的哪一部分可以异步执行?注意:“异步”与“在另一个线程上”不同。它们是相关的,但不同的,不同的主题。定义“不起作用”。到底是什么问题?旁注:MemoryStream
没有异步功能。。。非常不清楚使用async
标记完全同步的LoadDashboard函数的期望值。您的代码在同步模式下查询数据库。改用FirstAsync。内存流什么也不做asynchronous@AlexeiLevenkov我只想在LoadDashboard函数中异步加载数据,并允许我的用户与我的ui(菜单)交互,但您认为这段代码的哪一部分可以异步执行?注意:“异步”与“在另一个线程上”不同。它们是相关但不同的主题;因为LoadDashboard
仍在工作,如果第一个方法花费了很长时间,您可能拥有大量数据。您可能需要重新考虑如何使用仪表板,也许有一种方法可以减少传递的数据量。异步执行并不意味着它将立即执行。这意味着您的主线程不会被阻塞,并且在加载完成后将继续执行finished@EhsanAkbar试试我的更新版本,你根本不需要记忆流,你可以用一个StringReader@ScottChamberlain谢谢亲爱的朋友,您的更新不需要任何异步函数?我在我的代码dashboardViewer1.LoadDashboard(dashboardData)中的这一行后面放了一个断点;因为LoadDashboard
仍在工作,如果第一个方法花费了很长时间,您可能拥有大量数据。您可能需要重新考虑如何使用仪表板,也许有一种方法可以减少传递的数据量。异步执行并不意味着它将立即执行。这意味着您的主线程不会被阻塞,并且在加载完成后将继续执行finished@EhsanAkbar试试我的更新版本,你根本不需要MemoryStream,你只需要使用StringReader@ScottChamberlain谢谢你亲爱的朋友你的更新不需要任何异步函数吗?