广告:
clipboardData:System.NullReferenceException: 未将对象引用设置到对象的实例
异常详细信息: </b>System.NullReferenceException: 未将对象引用设置到对象的实例
行 220: IDataObject clipboardData = Clipboard.GetDataObject();
行 221: //检查剪贴板中的对象是否是图片,如果是图片则将其保存为指定格式的图片文件
<font color=red>行 222:
if (clipboardData.GetDataPresent(DataFormats.Bitmap))
</font>行 223: {
行 224:</pre>
clipboardData对象为null,一般可能不是单一线程模式造成的。
需要在处理页面加上:[STAThread]或者webform页面顶部加上aspcompat=“true"即可。
当页面中有使用creatobject创建com对象时,就需要设置aspcompat=“true”,
这样会使的COM对象实例在STA(单线程套间)里面执行,否则系统会将其安排在MTA里面执行。
MTA使用线程池来管理多个并发的请求
AutoEventWireup="true" AspCompat="true" CodeBehind="MakePhoto.aspx.cs"
如果升级到了asp.net 4.0以上,则web.config需要设置:
<appSettings> <add key="aspnet:UseTaskFriendlySynchronizationContext" value="false" /> </appSettings>
似乎有三种设置线程套间的方式:
第一种:是在函数前面加上一个属性:
[STAThread] void Main() { //// ... }
第二种:是不写[STAThread],而是给Thread对象设置ApartmentState属性:
Program obj = new Program(); Thread t1 = new Thread(obj.f1); t1.SetApartmentState(ApartmentState.STA); t1.Start();
对于com组件的调用而言,好像只有第二种情况是真的设置了STA线程套间属性,第一种似乎没有起作用。
[STAThread] 只对 C# 和 Visual Basic 中的 Main() 方法有效
第三种:加aspcompat=“true",针对aspx页面
广告: