clipboardData:System.NullReferenceException: 未将对象引用设置到对象的实例

广告:

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页面

广告:

编辑:Admin 时间:2021/12/20 10:45:10 阅览:236   返回    
clipboardData
扫描关注53BK报刊官网
扫描关注阅速公司微信