我试图在Windows Phone 7应用程序中的位图上呈现文本.
看起来或多或少类似于以下的代码在主线程上运行时可以正常工作:
public ImageSource RenderText(string text, double x, double y)
{
var canvas = new Canvas();
var textBlock = new TextBlock { Text = text };
canvas.Children.Add(textBloxk);
Canvas.SetLeft(textBlock, x);
Canvas.SetTop(textBlock, y);
var bitmap = new WriteableBitmap(400, 400);
bitmap.Render(canvas, null);
bitmap.Invalidate();
return bitmap;
}
Run Code Online (Sandbox Code Playgroud)
现在,由于我必须使用更复杂的东西渲染多个图像,我想在后台线程上渲染位图以避免无响应的UI.
当我使用a BackgroundWorker来执行此操作时,构造函数TextBlock会抛出UnauthorizedAccessException声称这是无效的跨线程访问.
我的问题是:如何在不阻塞UI的情况下在位图上呈现文本?
WriteableBitmap或UIElements,如果有另一种方式来呈现文本.编辑
另一个想法:有没有人知道是否应该可以在另一个线程中运行UI消息循环,然后让该线程完成工作?(而不是使用BackgroundWorker)?
编辑2
要考虑替代方案WriteableBitmap,我需要的功能是:
c# silverlight multithreading writeablebitmap windows-phone-7
我有一个包含2个表的SqlServer Compact Edition数据库.
对于这些表中的每一个,我都有一个派生的上下文类DbContext,应用程序使用该上下文类来访问该表.
为了保持应用程序的不同组件分离,我不能拥有一个具有DbSet两个表属性的上下文类.相反,我需要有2个不同的上下文类,每个上下文都必须完全不知道另一个及其数据.
我正在使用代码优先方法,我的代码定义了实体和模型,我让Entity Framework为我创建数据库.
我的问题是:我怎样才能让Entity Framework在上下文初始化时自动为我创建数据库和表,但仍然有2个上下文共享相同的数据库和连接?
现在我得到的是,第一个上下文成功创建了数据库及其中的表,但是当我尝试创建第二个上下文时,我得到了,不出所料的是以下错误:
The model backing the 'SomeObjectContext' context has changed since the database
was created. Either manually delete/update the database, or call Database.SetInitializer
with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges
strategy will automatically delete and recreate the database, and optionally seed it with
new data.
Run Code Online (Sandbox Code Playgroud)
没有一个IDatabaseInitializer适合我,因为我不希望在创建第二个上下文时删除整个数据库.我只想在现有数据库中创建第二个上下文表.
任何关于如何解决这个问题的建议将不胜感激.
谢谢
我希望它执行代码的第一部分,然后使pictureBox可见,暂停3秒,隐藏pictureBox并执行其余代码:
// first part of the code here
pb_elvisSherlock.Visible = true;
Thread.Sleep(300);
pb_elvisSherlock.Visible = false;
// rest of the code here
Run Code Online (Sandbox Code Playgroud)
但它执行整个代码块,然后暂停.有什么想法怎么办?
谢谢!