今天碰到一个很蛋疼的需求:运行一个exe把指定文件上传到一个内部的文件系统里去,并把exe返回的信息通过email发出去。
1. exe的返回信息是保存在Clipboard里面的。这个很蛋疼!!!
2. 运行exe/发送email必须是异步的。
在UI线程上面我们可以直接通过System.Windows.Forms.Clipboard.GetText()拿到Clipboard里面的文本,但是在后台线程里是不能访问Clipboard的(Clipboard.GetText()永远返回null)。Google完解决方案如下:


1 class ClipboardAsync
2 {
3 private string _getText;
4 private void ThGetText(object format)
5 {
6 try
7 {
8 _getText = format == null ? Clipboard.GetText() : Clipboard.GetText((TextDataFormat)format);
9 }
10 catch
11 {
12 _getText = null;
13 }
14 }
15
16 public static string GetText()
17 {
18 var instance = new ClipboardAsync();
19 var staThread = new Thread(instance.ThGetText);
20 staThread.SetApartmentState(ApartmentState.STA);
21 staThread.Start();
22 staThread.Join();
23 return instance._getText;
24 }
25
26 public static string GetText(TextDataFormat format)
27 {
28 var instance = new ClipboardAsync();
29 var staThread = new Thread(instance.ThGetText);
30 staThread.SetApartmentState(ApartmentState.STA);
31 staThread.Start(format);
32 staThread.Join();
33 return instance._getText;
34 }
35 }