.net 使用任务进行异步操作,但UI仍然没有响应

.net 使用任务进行异步操作,但UI仍然没有响应,.net,wpf,vb.net,task-parallel-library,.net,Wpf,Vb.net,Task Parallel Library,我有一个WPF应用程序,其中我必须执行一个长时间运行的任务(基本上是从网络读取)。为了给你们一个快照,我在点击按钮时做了以下事情 Dim t As Task(Of String) = Task.Factory.StartNew(Of String)(Function() 'Thread.sleep is simulating long running

我有一个WPF应用程序,其中我必须执行一个长时间运行的任务(基本上是从网络读取)。为了给你们一个快照,我在点击按钮时做了以下事情

 Dim t As Task(Of String) = Task.Factory.StartNew(Of String)(Function()
                                                                        'Thread.sleep is simulating long running task that will make UI unresponsive
                                                                        Thread.Sleep(10000)
                                                                        Return "Hello world from async task"
                                                                    End Function)

        TextBlock1.Text = t.Result
我不能使用基于事件的异步方法,因为读取API实际上存在于我在程序中引用的dll中,该dll包含一个函数
公共函数ReadFromNetwork(),作为字符串
。此API正在对网络进行异步调用,以读取长字符串并返回UI。简而言之,我正在做
TextBlock1.Text=ExternalDll.ReadFromNetwork()

但问题是,即使我使用任务异步,UI仍然没有响应

你能不能检测一下我的代码中是否遗漏了什么

如有任何帮助/建议,将不胜感激
Thanx提前

我想应该是这样的

t.ContinueWith((result) => { TextBlock1.Text = result.Result});

还是你只是在发帖时把它弄松了?您可能必须使用正确的计划程序,而不是在启动任务后在线路上使用
t.Result
。这将使线程阻塞,直到任务完成——因此所有异步都是徒劳的

您应该使用附加一个continuation,并将使用任务结果的代码放入该continuation中。这将允许UI在任务执行时返回处理事件,然后在任务完成时触发继续。传入以确保继续在正确的线程上激发


请注意,在下一版本的VB/C#中,使用异步方法将更容易实现所有这些。如果你能使用.NET 4.5发布候选,你应该考虑现在尝试这将使你的生活更简单。

你调用<代码> TestReult/Cord>,这将迫使任务执行。 您应该使用
ContinueWith
异步获取结果

    var action = delegate(Task<string> s)  // to avoid cross thread exception 
        {
            Action ac = delegate() { TextBlock1.Text = s.Result; };
            this.Dispatcher.Invoke(ac);

        };

      t.ContinueWith(action);
var action=delegate(任务)//避免跨线程异常
{
Action ac=delegate(){TextBlock1.Text=s.Result;};
this.Dispatcher.Invoke(ac);
};
t、 继续(行动);

请原谅我用c#

是的,乔恩,我知道。NET4.5将async和Wait关键字引入到语言中。但是我的应用程序本来就是由windows 8之前的操作系统使用的。@Uday0119:.NET 4.5不限于windows 8。现在我收到一个异常,因为调用线程无法访问此对象,因为它是另一个线程拥有的。
使用methodoops从ContinueWith访问TextBlock时,我的坏消息,我没有读你写的东西。现在它运行正常了。绝对值得考虑4.5版本的候选版本。尽管名称包括Windows 7和Windows Server 2008,但现在我遇到了一个异常,因为调用线程无法访问此对象,因为另一个线程拥有它。
从ContinueWith方法访问TextBlock时,请检查重载任务ContinueWith(Func continuationFunction,TaskScheduler scheduler);您可以通过var uithread=TaskScheduler.FromCurrentSynchronizationContext()传递可以绘制的UI调度程序;