这是我的一大发现。。(虽然很有可能早就有别人发现了。。)
我这里的异步是指,客户端1某此请求服务器端数据,服务器端先进行数据的接收,直到某一条件(比如说有另外的客户端2访问、某事件的触发)时,继续进行客户端1的数据的发送。
这里以客户端2的访问为例。
在aspx网页中放上一个Button,代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
Application["thread"] = System.Threading.Thread.CurrentThread;
Application["context"] = HttpContext.Current;
System.Threading.Thread.CurrentThread.Suspend();
Response.End();
}
}
}
某个客户端1访问时,按下按钮,然后客户端1处于等待状态;
直到另外一个客户端2访问时,客户端1的服务器处理线程停止挂起状态,并且客户端1的输出交给了服务器处理客户端2时的线程。
这正是我想要的效果。Asp.net的Application真是强大啊。。
在北航这个破地方能做出点东西来真不容易。。
Windows Mobile这个“老掉牙”的操作系统(其实我觉得WM还可以。。)上的计算器们都太蛋疼了,不是数字显示不了就是试用期已到。其实我的要求不高,能算出一般复杂的式子就可以了,也不需要太花哨的界面。于是我就用C#编了这个计算器。
根据我之前的谷歌一下,貌似很多人都表示Application的各个事件(尤其是各种收尾事件)的触发十分诡异。
而且这些事件还十分有用。比如说如果用Application作缓存,用户输入的东西先不直接存储在数据库中而先保存到Application中,直到Application到达一定大小时再一起存储进数据库。如果Application在销毁时不利用事件将剩余的数据存储,那么那些数据就将丢失。
于是刚才做了个小程序尝试了一下。在global.asax里写下这个:
这样的张总:你在家里的电脑上按了CTRL+C,然后在公司的电脑上再按CTRL+V是肯定不行的。即使同一篇文章也不行。不不,多贵的电脑都不行。
张总的愿望终于可以实现了。经过将近半个月的折磨,这个传说中的“云剪贴板”终于发布了!现在开始我们可以在不同的电脑上共享多达100条的剪贴板,支持普通文本、word文档、HTML文档等格式!
当然google docs是最先实现这个功能的工具,不过并不是所有需要复制粘贴的东西都在google docs中,况且google docs不一定能时时刻刻访问(比如说连接被重置)。
不过现在这个程序的缺点就是不能跨平台,因为是用c#编的。我的索尼本不能用ubuntu,所以不能测试可不可以在mono下运行。估计够呛。
云端的地址初始为:http://graphonline.info/clip/service.asmx 程序中已经预先定义了这个地址。如果这个地址挂了,可以把云端的asp.net程序发布到别的主机上,然后改一下.config文件就可以了。
不过毕竟只是一个简单到极点的beta版的小工具,有一些力所不能及的事情它是不能做到的。比如说拷贝超过10k的大文本,在网络不好的时候很容易出错;不能拷贝excel表格,因为不知道为啥excel每次拷贝时总会同时拷贝四次,造成网络堵塞而出问题。更有许多bug,等待着大家去发现。
计划在下个版本中加入上传功能,解决目前的上传不稳定的问题;还打算加入对图片格式的支持。
好了不废话了。下面是下载地址:
用Clipboard.GetData(format)与Clipboard.SetData(format,data)中的format竟然大小写敏感..搞了好久才知道。
| format | 返回类型 |
| Text | string |
| text以及其所有大小写格式 | MemoryStream |
| HTML Format | string |
| html format以及其所有大小写格式 | MemoryStream |
| … | … |
我建议都用MemoryStream的,可以用ToArray()输出byte[]。 string的很容易出现各种各样的问题,尤其在HTML Format上。
最近在做一个云剪贴板的程序,需要用一个c#桌面应用程序来监控剪贴板。本来想的是,新建一个线程用while循环检查剪贴板内容的改动,不过发现不成功,如果用GetText()访问剪贴板则不管剪贴板内有没有文字都返回空字符串,用SetText()设置剪贴板则出错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。”
所以我google了一下,发现貌似监视剪贴板可以不用“幕后线程”去不断检查,有专门的API来进行监视,并通过触发事件来告诉我们。
按下Ctrl+Alt+Del,会出现一个叫“windows任务管理器”的窗口。在它的“性能”标签中有个叫“CPU使用率”的东西。
其实这个东西很像是人品。。或者说是RP,比如说在运行这个程序的时候(C#):