如何创建一个异步方法(How to create an asynchronous method)

2019-06-26 10:41发布

我有简单的方法在我的C#应用​​程序,它从FTP服务器拿起文件,并解析它,在DB存储数据。 我想这是异步的,所以用户在App进行其他操作,一旦解析完成他得到消息,指出“解析完成”。

我知道它可以通过异步方法调用实现,但我不知道怎么做,任何人可以帮我请?

Answer 1:

您需要使用代表和BeginInvoke方法,它们包含异步运行的另一种方法。 该方法的结束被委托运行,您可以通知用户。 例如:

class MyClass
{
    private delegate void SomeFunctionDelegate(int param1, bool param2);
    private SomeFunctionDelegate sfd;

    public MyClass()
    {
        sfd = new SomeFunctionDelegate(this.SomeFunction);
    }

    private void SomeFunction(int param1, bool param2)
    {
        // Do stuff

        // Notify user
    }

    public void GetData()
    {
        // Do stuff

        sfd.BeginInvoke(34, true, null, null);
    }
}

阅读了在http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx



Answer 2:

试试这个方法

public static void RunAsynchronously(Action method, Action callback) {
    ThreadPool.QueueUserWorkItem(_ =>
    {
        try {
            method();
        } 
        catch (ThreadAbortException) { /* dont report on this */ } 
        catch (Exception ex) {
        }
        // note: this will not be called if the thread is aborted
        if (callback!= null) callback();
    });
}

用法:

RunAsynchronously( () => { picks file from FTP server and parses it}, 
       () => { Console.WriteLine("Parsing is done"); } );


Answer 3:

任何你正在做的事情异步时间,你使用一个单独的线程,无论是一个新的线程,或者一个线程池中取出。 这意味着,任何你做异步必须非常小心与其他线程交互。

要做到这一点的方法之一是放置在异步线程的代码(称为线程“A”) 与它的所有数据一起到另一个类(称之为“A”级)。 确保线程“A”仅访问数据类“A”。 如果线程“A”仅触及“A”级,并没有其他线程触及“A”级的数据,那么就少了一个问题:

public class MainClass
{
    private sealed class AsyncClass
    {
        private int _counter;
        private readonly int _maxCount;

        public AsyncClass(int maxCount) { _maxCount = maxCount; }

        public void Run()
        {
            while (_counter++ < _maxCount) { Thread.Sleep(1); }
            CompletionTime = DateTime.Now;
        }

        public DateTime CompletionTime { get; private set; }
    }

    private AsyncClass _asyncInstance;
    public void StartAsync()
    {
        var asyncDoneTime = DateTime.MinValue;
        _asyncInstance = new AsyncClass(10);
        Action asyncAction = _asyncInstance.Run;
        asyncAction.BeginInvoke(
            ar =>
                {
                    asyncAction.EndInvoke(ar);
                    asyncDoneTime = _asyncInstance.CompletionTime;
                }, null);
        Console.WriteLine("Async task ended at {0}", asyncDoneTime);
    }
}

请注意,只有部分AsyncClass这与外界接触是它的公共接口,而那唯一部件,它是数据CompletionTime 。 需要注意的是异步任务完成后,这仅仅是感动。 这意味着,没有别的可以与任务内部运作干涉,它不能与其他任何干涉。



Answer 4:

以下是有关在C#线程两个链接

  • 线程在C#
  • 多线程在.NET:介绍和建议

我开始阅读有关的BackgroundWorker类



Answer 5:

在Asp.Net我用了很多的静态方法做的工作。 如果它是一份工作,我需要无反应或状态,我做一些简单的像下面。 正如你可以看到我可以选择拨打或者ResizeImages或ResizeImagesAsync取决于如果我想等它完成与否

代码解释:我用http://imageresizing.net/调整大小/裁切图像和方法SaveBlobPng是将图像存储天青(云)却自认为这个演示是无关的我不包括该代码。 它的耗时的任务,一个很好的例子,虽然

private delegate void ResizeImagesDelegate(string tempuri, Dictionary<string, string> versions);
private static void ResizeImagesAsync(string tempuri, Dictionary<string, string> versions)
{
    ResizeImagesDelegate worker = new ResizeImagesDelegate(ResizeImages);
    worker.BeginInvoke(tempuri, versions, deletetemp, null, null);
}
private static void ResizeImages(string tempuri, Dictionary<string, string> versions)
{
    //the job, whatever it might be
    foreach (var item in versions)
    {
        var image = ImageBuilder.Current.Build(tempuri, new ResizeSettings(item.Value));
        SaveBlobPng(image, item.Key);
        image.Dispose();
    }
}

或去为线程所以你不要有代表打扰

private static void ResizeImagesAsync(string tempuri, Dictionary<string, string> versions)
{
    Thread t = new Thread (() => ResizeImages(tempuri, versions, null, null));
    t.Start(); 
}


Answer 6:

ThreadPool.QueueUserWorkItem是获得在不同的线程运行的进程的最快方式。

要知道,UI对象具有“线程亲和力”,不能从比创建它们的一个以外的任何线程访问。

因此,除了检查出的线程池(或通过代表使用异步编程模型),您需要检查调度员 (WPF)或InvokeRequired (的WinForms)。



Answer 7:

最后,你将不得不使用某种线程的。 它基本的工作方式是,你开始一个新的线程的功能,它会运行,直到函数结束。

如果您使用的是Windows窗体,然后一个漂亮的包装,他们有这个调用后台工作。 它可以让你在后台工作与出锁定UI形式,甚至提供了一种方法与形式进行沟通,并提供最新进展的事件。

后台工作



Answer 8:

.NET有了新的关键字异步的asonchrynous功能。 你可以开始挖掘docs.microsoft.com(异步) 。 最短一般HOWTO化妆功能asonchrynous是改变函数F:

Object F(Object args)
{
    ...
    return RESULT;
}

对这样的事情:

async Task<Object> FAsync(Object args)
{
    ...
    await RESULT_FROM_PROMISE;
    ...
    return RESULT;
}

在上面的代码中最重要的事情是,当你的代码的方式等待关键字它控制返回给函数调用FASYNC并进行其他计算,直到promissed值已经返回并在功能FASYNC的代码休息PROCEDE。



文章来源: How to create an asynchronous method