相关疑难解决方法(0)

单元测试异步功能

在下面的代码示例中,我有一个Async Calculator类.这是注入一个ICalc,它将是一个同步计算器.我使用依赖注入和模拟ICalc,因为这类似于我的真实场景,尽管我认为模拟与问题无关.AsyncCalc有一个函数,它将异步调用另一个函数 - 将回调作为参数.当异步函数调用完成时,将使用结果触发回调.

现在我想测试我的异步函数 - 检查是否使用期望参数触发了回调.这段代码似乎有效.但是,我觉得它可能随时都会爆炸 - 我担心的是在函数结束和测试终止之前完成回调的竞争条件 - 因为这将在一个单独的线程中运行.

我现在的问题是,如果我在正确的轨道单元测试异步功能,或者是否有人可以帮助我走上正确的轨道..?更好的是,如果我能确保立即触发回调 - 最好是在同一个线程上我猜?可以/应该这样做吗?

public interface ICalc
{
    int AddNumbers(int a, int b);
}

public class AsyncCalc
{
    private readonly ICalc _calc;
    public delegate void ResultProcessor(int result);
    public delegate int AddNumbersAsyncCaller(int a, int b);

    public AsyncCalc(ICalc calc)
    {
        _calc = calc; 
    }

    public void AddNumbers(int a, int b, ResultProcessor resultProcessor)
    {
        var caller = new AddNumbersAsyncCaller(_calc.AddNumbers);
        caller.BeginInvoke(a, b, new AsyncCallback(AddNumbersCallbackMethod), resultProcessor);
    }

    public void AddNumbersCallbackMethod(IAsyncResult ar)
    {
        var result = …
Run Code Online (Sandbox Code Playgroud)

.net c# unit-testing asynchronous

21
推荐指数
1
解决办法
1万
查看次数

如何让HttpWebRequest尽可能同步?


摘要:这甚至可能吗?

unit test function on ui thread:
- creates a background thread
- starts the thread
- waits for it to complete (function does not exit until it completes!)

background thread:
- opens an http stream 
- reads a url from the web
- terminates
Run Code Online (Sandbox Code Playgroud)

我的怀疑:框架异步地将结果放到一些内部消息队列中,因此在ui线程的堆栈展开之前永远不会调用响应回调,并转到某个ui线程函数来抽取堆栈.


全文:

我正在移植一个应用程序,需要从各种来源创建一个流,其中一个来自一个简单的http网址.我在后台线程上这样做,理想情况下我希望它100%同步,只需要在需要时阻塞(这是好的,因为它在后台线程上).

但似乎框架有点米老鼠,因为它假定你将在ui线程上执行请求,因此它将保护编码器不必创建后台线程来执行异步操作.但我可能会遗漏一些东西.

我偶然发现了以下文章:http: //pieterderycke.wordpress.com/2011/05/23/adding-synchronous-methods-to-webrequest-on-windows-phone-7/,它提出了一个解决方案,使http web请求同步.但是当它实现时,我得到一个ProtocolViolationException.我已经对代码进行了修改以使用BeginGetResponse()而不是BeginGetRequestStream(),这似乎不再导致异常.

但似乎后台线程现在无限期地阻塞.在我的ui线程上,我循环,执行Thread.Sleep(10)因为我在单元测试函数中,等待我的回调被调用.是否有可能在单元测试函数返回并且ui线程有机会抽取消息之前不会调用回调?如果是这样,我可以用任何方式强制它进行泵送,以便我可以继续在单元测试程序中停止的地方?

在上面提到的文章的底部,发表评论"如果你测试你的代码,你会发现如果你在UI线程上执行它会死锁." 但是我在后台线程上执行它,所以应该没问题吧?

msdn文档只显示如何进行异步调用.他们还提到"BeginGetResponse方法需要一些同步设置任务才能完成"......"通常需要几秒钟"......但"可能需要60秒或更长时间".在ui线程上执行这听起来很糟糕. http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse.aspx

请帮忙!

这是我的代码:

using System.Net;
using System.Threading;
using System;
using System.IO;

namespace Blah
{
  // http://pieterderycke.wordpress.com/2011/05/23/adding-synchronous-methods-to-webrequest-on-windows-phone-7/
  // Creates synchronous web requests. …
Run Code Online (Sandbox Code Playgroud)

c# silverlight windows-phone-7

6
推荐指数
1
解决办法
9413
查看次数