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谢谢你亲爱的朋友你的更新不需要任何异步函数吗?