我有简单的方法在我的C#应用程序,它从FTP服务器拿起文件,并解析它,在DB存储数据。 我想这是异步的,所以用户在App进行其他操作,一旦解析完成他得到消息,指出“解析完成”。
我知道它可以通过异步方法调用实现,但我不知道怎么做,任何人可以帮我请?
我有简单的方法在我的C#应用程序,它从FTP服务器拿起文件,并解析它,在DB存储数据。 我想这是异步的,所以用户在App进行其他操作,一旦解析完成他得到消息,指出“解析完成”。
我知道它可以通过异步方法调用实现,但我不知道怎么做,任何人可以帮我请?
您需要使用代表和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
试试这个方法
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"); } );
任何你正在做的事情异步时间,你使用一个单独的线程,无论是一个新的线程,或者一个线程池中取出。 这意味着,任何你做异步必须非常小心与其他线程交互。
要做到这一点的方法之一是放置在异步线程的代码(称为线程“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
。 需要注意的是异步任务完成后,这仅仅是感动。 这意味着,没有别的可以与任务内部运作干涉,它不能与其他任何干涉。
以下是有关在C#线程两个链接
我开始阅读有关的BackgroundWorker类
在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();
}
ThreadPool.QueueUserWorkItem是获得在不同的线程运行的进程的最快方式。
要知道,UI对象具有“线程亲和力”,不能从比创建它们的一个以外的任何线程访问。
因此,除了检查出的线程池(或通过代表使用异步编程模型),您需要检查调度员 (WPF)或InvokeRequired (的WinForms)。
最后,你将不得不使用某种线程的。 它基本的工作方式是,你开始一个新的线程的功能,它会运行,直到函数结束。
如果您使用的是Windows窗体,然后一个漂亮的包装,他们有这个调用后台工作。 它可以让你在后台工作与出锁定UI形式,甚至提供了一种方法与形式进行沟通,并提供最新进展的事件。
后台工作
.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。