1

我有一个方法,需要一个BitmapImage.

我试图通过创建或加载 aBitmapImage然后将其传递给所述方法来测试它。

但是,单元测试不允许我创建一个bitmapimage,它会抛出一个InvalidCrossThreadException.

是否有任何文档或资源详细说明如何对BitmapImages采用Windows Phone 8.

我们正在使用Visual Studio 2012-update 2

4

1 回答 1

2

BitmapImage只能在 UI 线程上运行,而单元测试是从后台线程运行的。这就是您收到此异常的原因。对于任何涉及BitmapImage或其他 UI 组件的测试,您需要:

  1. 将 UI 工作推送到 UI 线程使用Dispatcher.BeginInvoke()
  2. 在完成测试之前等待 UI 线程完成。

例如,使用ManualResetEvent(信号量)进行跨线程信号发送,并确保将任何(可捕获的)异常传递回测试线程......

[TestMethod]
public void TestMethod1()
{
    ManualResetEvent mre = new ManualResetEvent(false);
    Exception uiThreadException = null;

    Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            try
            {
                BitmapImage bi = new BitmapImage();

                // do more stuff
                // simulate an exception in the UI thread
                // throw new InvalidOperationException("Ha!");
            }
            catch (Exception e)
            {
                uiThreadException = e;
            }

            // signal as complete
            mre.Set();                    
        });

    // wait at most 1 second for the operation on the UI thread to complete
    bool completed =  mre.WaitOne(1000);
    if (!completed)
    {
        throw new Exception("UI thread didn't complete in time");
    }

    // rethrow exception from UI thread
    if (uiThreadException != null)
    {
        throw uiThreadException;
    }
}
于 2013-06-21T14:49:20.697 回答