Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events C#-调用异步方法的简单方法?_Events_User Interface_Asynchronous - Fatal编程技术网

Events C#-调用异步方法的简单方法?

Events C#-调用异步方法的简单方法?,events,user-interface,asynchronous,Events,User Interface,Asynchronous,我正在开发一个c#user control@work。控件只是加载一些信息和数据并显示它。 现在我想为控件的用户提供一个选项来异步加载数据。。smth是这样的: Cntrl.LoadSmthAsync(..) Cntrl.LoadSmthComplete //EventHandler to give feedback if the Load was successfull. public async Task<byte[]> LoadByPos(int pos) {


我正在开发一个c#user control@work。控件只是加载一些信息和数据并显示它。
现在我想为控件的用户提供一个选项来异步加载数据。。smth是这样的:

Cntrl.LoadSmthAsync(..)
Cntrl.LoadSmthComplete   //EventHandler to give feedback if the Load was successfull.
public async Task<byte[]> LoadByPos(int pos)
{
    string url = await Pos2UrlAsync(pos);

    // update gui
    this.textBox1.Text = url;

    byte[] res = await LoadByUrlAsync(url);

    // update gui
    this.textBox2.Text = BytesToString(res);

    return res;
}
我决定使下载函数异步,并通过EventHandler提供返回值<但是代码变得相当复杂了。。毕竟

下面是一些代码,以了解控件应执行的操作:

    public byte[] LoadByPos(int pos)
    {
        string url = Pos2Url(pos);

        // update gui
        this.textBox1.Text = url;

        byte[] res = LoadByUrl(url);

        // update gui
        this.textBox2.Text = BytesToString(res);

        return res;
    }

    public byte[] LoadByUrl(string url)
    {
        return Download(url);
    }

    //primary problem: download function
    private byte[] Download(string url)
    {
        System.Threading.Thread.Sleep(1000 * 30);
        return StringToBytes(url);
    }

    //secondary problem: an other function
    private string Pos2Url(int pos)
    {
        System.Threading.Thread.Sleep(1000 * 5);
        return pos.ToString();
    }




    // LoadByPosAsync
    public delegate void LoadByPosDoneHandler(Object sender, byte[] e);
    public event LoadByPosDoneHandler LoadByPosDone;

    public void LoadByPosAsync(int pos)
    {
        string url = Pos2Url(pos);

        // update gui
        this.textBox1.Text = url;

        LoadByUrlDone += new LoadByUrlDoneHandler(LoadByPosAsync_LoadByUrlDone);
        LoadByUrlAsync(url);
    }
    public void  LoadByPosAsync_LoadByUrlDone(object sender, byte[] e)
    {
        // update gui
        this.textBox2.Text = BytesToString(e);

        LoadByUrlDone = null;
        LoadByPosDone(sender, e);
    }


    //LoadByUrlAsync

    public delegate void LoadByUrlDoneHandler(Object sender, byte[] e);
    public event LoadByUrlDoneHandler LoadByUrlDone;

    public void LoadByUrlAsync(string url)
    {
        DownloadDone += new DownloadDoneHandler(LoadByUrlAsync_DownloadDone);
        DownloadAsync(url);
    }
    private void LoadByUrlAsync_DownloadDone(object sender, byte[] e)
    {
        LoadByUrlDone(sender, e);
    }

    //DownloadAsync

    private delegate void DownloadDoneHandler(Object sender, byte[] e);
    private event DownloadDoneHandler DownloadDone;

    private void DownloadAsync(string url)
    {
        BackgroundWorker bw_DownloadAsync = new BackgroundWorker();
        bw_DownloadAsync.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_DownloadAsync_RunWorkerCompleted);
        bw_DownloadAsync.DoWork += new DoWorkEventHandler(bw_DownloadAsync_DoWork);
        bw_DownloadAsync.RunWorkerAsync(url);
    }
    void bw_DownloadAsync_DoWork(object sender, DoWorkEventArgs e)
    {
        byte[] res = Download((string)e.Argument);
        e.Result = res;
    }
    void bw_DownloadAsync_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        DownloadDone(sender, (byte[])e.Result);
    }
有没有更简单的方法来完成我打算做的事情

提前thx

有没有更简单的方法来完成我打算做的事情

实现端是分开的,但是如果您使用的是.NET4,我强烈建议您不要将此模型用于异步。我建议您使用
Task
,而不是使用事件处理程序。如果没有任何固有的支持,您可以使用来创建任务,这意味着由于异步/等待支持,您的API在C#5中使用起来会更容易。此时,您的UI线程方法如下所示:

Cntrl.LoadSmthAsync(..)
Cntrl.LoadSmthComplete   //EventHandler to give feedback if the Load was successfull.
public async Task<byte[]> LoadByPos(int pos)
{
    string url = await Pos2UrlAsync(pos);

    // update gui
    this.textBox1.Text = url;

    byte[] res = await LoadByUrlAsync(url);

    // update gui
    this.textBox2.Text = BytesToString(res);

    return res;
}
public异步任务LoadByPos(int-pos)
{
字符串url=等待POS2URLSync(pos);
//更新图形用户界面
this.textBox1.Text=url;
字节[]res=wait loadbyurlsync(url);
//更新图形用户界面
this.textBox2.Text=BytesToString(res);
返回res;
}

异步将自然地在代码中流动

谢谢你的快速回复!我目前有点绑定到.Net 2.0,因为该控件可能也用于较旧的客户端应用程序中,我们目前无法移植。你发布的代码在我看来非常甜美。。但是我不知道我是否能在.NET2.0中使用它。。.NET2.0能够处理c#5吗?谢谢你的帮助。@nox:有可能通过大量的工作和黑客手段,你可以让它正常工作,但这并不是一个明智的选择。