xml version="1.0" encoding="utf-8" standalone="yes"12bet++博客-天下http://www.fometaux.com/aaxron/记录修行的印记 zh-cnWed, 03 Apr 2019 20:35:52 GMTWed, 03 Apr 2019 20:35:52 GMT6012bet++博客-天下http://www.fometaux.com/aaxron/archive/2019/02/12/216238.html天下天下Tue, 12 Feb 2019 03:44:00 GMThttp://www.fometaux.com/aaxron/archive/2019/02/12/216238.htmlhttp://www.fometaux.com/aaxron/comments/216238.htmlhttp://www.fometaux.com/aaxron/archive/2019/02/12/216238.html#Feedback0http://www.fometaux.com/aaxron/comments/commentRss/216238.htmlhttp://www.fometaux.com/aaxron/services/trackbacks/216238.htmlspring 官方下载地址(Spring Framework 3.2.x&Spring Framework 4.0.x)
2017年02月24日 15:53:59

SPRING官方网站改版后,建议都是通过 Maven和Gradle下载,对不使用Maven和Gradle开发项目的,下载就非常麻烦,下给出Spring Framework jar官方直接下载路径:

http://repo.spring.io/libs-release-local/org/springframework/spring/

 

spring 4.0.x(Spring Framework 4.0.5)下载

http://repo.spring.io/libs-release-local/org/springframework/spring/4.0.5.RELEASE/spring-framework-4.0.5.RELEASE-dist.zip

 

spring 3.2.x(Spring Framework 3.2.9)下载:

http://repo.spring.io/libs-release-local/org/springframework/spring/3.2.9.RELEASE/spring-framework-3.2.9.RELEASE-dist.zip

 

 

spring 3.2.x(Spring Framework 3.2.4)下载:

http://repo.springsource.org/libs-release-local/org/springframework/spring/3.2.4.RELEASE/spring-framework-3.2.4.RELEASE-dist.zip


 

另spring security下载路径:

http://repo.spring.io/libs-release-local/org/springframework/security/spring-security/

http://repo.spring.io/libs-release-local/org/springframework/security/spring-security/3.2.4.RELEASE/spring-security-3.2.4.RELEASE-dist.zip



天下 2019-02-12 11:44 发表评论
]]>
12bet++博客-天下http://www.fometaux.com/aaxron/archive/2018/04/11/215585.html天下天下Wed, 11 Apr 2018 08:40:00 GMThttp://www.fometaux.com/aaxron/archive/2018/04/11/215585.htmlhttp://www.fometaux.com/aaxron/comments/215585.htmlhttp://www.fometaux.com/aaxron/archive/2018/04/11/215585.html#Feedback0http://www.fometaux.com/aaxron/comments/commentRss/215585.htmlhttp://www.fometaux.com/aaxron/services/trackbacks/215585.htmlpublic class AnnotationMethodHandlerAdapter extends WebContentGenerator
        
implements HandlerAdapter, Ordered, BeanFactoryAware {
    
//

    
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        
return invokeHandlerMethod(request, response, handler);
    }

    
protected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        ServletHandlerMethodResolver methodResolver 
= getMethodResolver(handler);
        Method handlerMethod 
= methodResolver.resolveHandlerMethod(request);
        ServletHandlerMethodInvoker methodInvoker 
= new ServletHandlerMethodInvoker(methodResolver);
        ServletWebRequest webRequest 
= new ServletWebRequest(request, response);
        ExtendedModelMap implicitModel 
= new BindingAwareModelMap();

        Object result 
= methodInvoker.invokeHandlerMethod(handlerMethod, handler, webRequest, implicitModel);
        ModelAndView mav 
=
                methodInvoker.getModelAndView(handlerMethod, handler.getClass(), result, implicitModel, webRequest);
        methodInvoker.updateModelAttributes(handler, (mav 
!= null ? mav.getModel() : null), implicitModel, webRequest);
        
return mav;
    }

    
public ModelAndView getModelAndView(Method handlerMethod, Class<?> handlerType, Object returnValue,
            ExtendedModelMap implicitModel, ServletWebRequest webRequest) 
throws Exception {}
}


其他
public final class Method extends Executable {
    
public Object invoke(Object obj, Object args)
    
throws IllegalAccessException, IllegalArgumentException,InvocationTargetException
    {
        
if (!override) {
            
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
                Class
<?> caller = Reflection.getCallerClass();
                checkAccess(caller, clazz, obj, modifiers);
            }
        }
        MethodAccessor ma 
= methodAccessor;             // read volatile
        if (ma == null) {
            ma 
= acquireMethodAccessor();
        }
        
return ma.invoke(obj, args);
    }
}
public class ModelMap extends LinkedHashMap<String, Object> {}

public abstract class AbstractView extends WebApplicationObjectSupport implements View, BeanNameAware {
    
/**
     * Prepares the view given the specified model, merging it with static
     * attributes and a RequestContext attribute, if necessary.
     * Delegates to renderMergedOutputModel for the actual rendering.
     * 
@see #renderMergedOutputModel
     
*/
    @Override
    
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
        
if (logger.isTraceEnabled()) {
            logger.trace(
"Rendering view with name '" + this.beanName + "' with model " + model +
                
" and static attributes " + this.staticAttributes);
        }

        Map
<String, Object> mergedModel = createMergedOutputModel(model, request, response);
        prepareResponse(request, response);
        renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);
    }
}
代码:


天下 2018-04-11 16:40 发表评论
]]>
12bet++博客-天下http://www.fometaux.com/aaxron/archive/2018/04/11/215584.html天下天下Wed, 11 Apr 2018 08:39:00 GMThttp://www.fometaux.com/aaxron/archive/2018/04/11/215584.htmlhttp://www.fometaux.com/aaxron/comments/215584.htmlhttp://www.fometaux.com/aaxron/archive/2018/04/11/215584.html#Feedback0http://www.fometaux.com/aaxron/comments/commentRss/215584.htmlhttp://www.fometaux.com/aaxron/services/trackbacks/215584.htmlpublic class DispatcherServlet extends FrameworkServlet {
    
private List<HandlerMapping> handlerMappings;

    
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
        doDispatch(request, response);
    }
    
    
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpServletRequest processedRequest 
= request;
        HandlerExecutionChain mappedHandler 
= null;
        
boolean multipartRequestParsed = false;
        
try {
            ModelAndView mv 
= null;
            Exception dispatchException 
= null;
            
try {
                processedRequest 
= checkMultipart(request);
                multipartRequestParsed 
= (processedRequest != request);

                
// Determine handler for the current request.  //映射处理器
                mappedHandler = getHandler(processedRequest); //HandlerExecutionChain
                if (mappedHandler == null || mappedHandler.getHandler() == null) {
                    noHandlerFound(processedRequest, response);
                    
return;
                }

                
// Determine handler adapter for the current request. //适配处理器
                HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

                
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                    
return;
                }

                
// Actually invoke the handler. 
                mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

                applyDefaultViewName(processedRequest, mv); 
                mappedHandler.applyPostHandle(processedRequest, response, mv);
            }

            
//渲染视图
            processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); 
        }
        
catch (Exception ex) {
            triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
        }
        
finally {
        }
    }
    
private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,
        HandlerExecutionChain mappedHandler, ModelAndView mv, Exception exception) 
throws Exception {
        
// Did the handler return a view to render?
        if (mv != null && !mv.wasCleared()) {
            render(mv, request, response);
        }
        
else {
            
if (logger.isDebugEnabled()) {
                logger.debug(
"Null ModelAndView returned to DispatcherServlet with name '" + getServletName() +
                        
"': assuming HandlerAdapter completed request handling");
            }
        }
        
if (mappedHandler != null) {
            mappedHandler.triggerAfterCompletion(request, response, 
null);
        }
    }
    
    
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
        
// Determine locale for request and apply it to the response.
        Locale locale = this.localeResolver.resolveLocale(request);
        response.setLocale(locale);

        View view;
        
if (mv.isReference()) {
            
// We need to resolve the view name.
            view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
            
if (view == null) {
                
throw new ServletException("Could not resolve view with name '" + mv.getViewName() +
                        
"' in servlet with name '" + getServletName() + "'");
            }
        }
        
else {
            
// No need to lookup: the ModelAndView object contains the actual View object.
            view = mv.getView();
            
if (view == null) {
                
throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
                        
"View object in servlet with name '" + getServletName() + "'");
            }
        }

        
// Delegate to the View object for rendering.
        if (logger.isDebugEnabled()) {
            logger.debug(
"Rendering view [" + view + "] in DispatcherServlet with name '" + getServletName() + "'");
        }
        
try {
            view.render(mv.getModelInternal(), request, response);
        }
        
catch (Exception ex) {
            logger.debug(
"Error rendering view [" + view + "] in DispatcherServlet with name '" +    getServletName() + "'", ex);
            
throw ex;
        }
}


天下 2018-04-11 16:39 发表评论
]]>
12bet++博客-天下http://www.fometaux.com/aaxron/archive/2017/05/17/214944.html天下天下Wed, 17 May 2017 10:56:00 GMThttp://www.fometaux.com/aaxron/archive/2017/05/17/214944.htmlhttp://www.fometaux.com/aaxron/comments/214944.htmlhttp://www.fometaux.com/aaxron/archive/2017/05/17/214944.html#Feedback0http://www.fometaux.com/aaxron/comments/commentRss/214944.htmlhttp://www.fometaux.com/aaxron/services/trackbacks/214944.htmlMoveWindow() SetWindowPos()的区别与联系
转自http://www.cnblogs.com/songliquan/p/3359002.html

先看MoveWindow()函数,用于改变窗口的位置和尺寸,对于顶层窗口,按照屏幕对齐与左上角,对于子窗口,则对齐与父窗口的左上角。

BOOL MoveWindow( HWND hWnd,
int x, int y, int nWidth, int nHeight,BOOL bRepaint = TRUE);
参数hWnd表示窗口句柄;
参数x,y表示窗口的左上角起点;
参数nwidth,nHeight 表示窗口高度和宽度;
最后一个bRepaint表示是否立即重绘。为true时系统会立即发送WM_PAINT到窗口程序(会调用UpdateWindow()函数),为false时不会发生任何类型的重绘操作。

MoveWindow会给窗口发送WM_WINDOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE和WM_NCCALCSIZE消息。

接下来看SetWindowPos(),这个函数同样用来实现窗口移动操作,只不过功能更多一点。

BOOL SetWindowPos(HWND hWnd,
const CWnd* pWndInsertAfter, int x, int y,int cx, int cy, UINT nFlags);
第一个参数是窗口句柄;
第二个参数是窗口的Z order,就是有多个窗口时,本窗口显示的顺序,最上面或者最下面,可选参数有:HWND_BOTTOM,HWND_NOTOPMOST,HWND_TOP,HWND_TOPMOST.
HWND_BOTTOM:将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。     
HWND_NOTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。     
HWND_TOP:将窗口置于Z序的顶部。     
HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。 
接下来四个参数是窗口的位置和尺寸。
最后一个参数nFlags是窗口显示方式的标志,这个参数很多,可以组合使用,详细如下:
SWP_ASNCWINDOWPOS:如果调用进程不拥有窗口,系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁。    
SWP_DEFERERASE:防止产生WM_SYNCPAINT消息。    
SWP_DRAWFRAME:在窗口周围画一个边框(定义在窗口类描述中)。    
SWP_FRAMECHANGED:给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志,只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。 
SWP_HIDEWINDOW;隐藏窗口。 
SWP_NOACTIVATE:不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部(根据参数hWndlnsertAfter设置)。 
SWP_NOCOPYBITS:清除客户区的所有内容。如果未设置该标志,客户区的有效内容被保存并且在窗口尺寸更新和重定位后拷贝回客户区。 
SWP_NOMOVE:维持当前位置(忽略X和Y参数)。    
SWP_NOOWNERZORDER:不改变z序中的所有者窗口的位置。 
SWP_NOREDRAW:不重画改变的内容。如果设置了这个标志,则不发生任何重画动作。适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动而露出的父窗口的所有部分。如果设置了这个标志,应用程序必须明确地使窗口无效并重画窗口的任何部分和父窗口需要重画的部分。 
SWP_NOREPOSITION;与SWP_NOOWNERZORDER标志相同。      SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。 
SWP_NOSIZE:维持当前尺寸(忽略cx和Cy参数)。 
SWP_NOZORDER:维持当前Z序(忽略hWndlnsertAfter参数)。 
SWP_SHOWWINDOW:显示窗口。
注意事项:
使用SetWindowPos()如果设置了SWP_SHOWWINDOWS或者SWP_HIDEWINDOW,那么窗口将不能被移动和改变大小,我使用时就是设置了SWP_SHOWWINDOW,从而导致不能重绘背景。

两者的比较:
两者都能实现移动和改变窗口大小。

MoveWindow()功能比较单一,只能移动和改变窗口大小,而SetWindowPos()可以设置更多的参数,实现Zorder及显示方式标志。

MoveWindow()发送WM_WINDOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE和WM_NCCALCSIZE等消息到窗口,SetWindowPos()只发送WM_WINDOWPOSCHANGED消息到窗口。所以说如果需要发送更多消息时还是使用MoveWindow()的好。


天下 2017-05-17 18:56 发表评论
]]>
12bet++博客-天下http://www.fometaux.com/aaxron/archive/2017/05/16/214936.html天下天下Tue, 16 May 2017 03:06:00 GMThttp://www.fometaux.com/aaxron/archive/2017/05/16/214936.htmlhttp://www.fometaux.com/aaxron/comments/214936.htmlhttp://www.fometaux.com/aaxron/archive/2017/05/16/214936.html#Feedback0http://www.fometaux.com/aaxron/comments/commentRss/214936.htmlhttp://www.fometaux.com/aaxron/services/trackbacks/214936.html

/Files/aaxron/OppoTestX.rar

天下 2017-05-16 11:06 发表评论
]]>
12bet++博客-天下http://www.fometaux.com/aaxron/archive/2016/12/13/214480.html天下天下Tue, 13 Dec 2016 02:09:00 GMThttp://www.fometaux.com/aaxron/archive/2016/12/13/214480.htmlhttp://www.fometaux.com/aaxron/comments/214480.htmlhttp://www.fometaux.com/aaxron/archive/2016/12/13/214480.html#Feedback0http://www.fometaux.com/aaxron/comments/commentRss/214480.htmlhttp://www.fometaux.com/aaxron/services/trackbacks/214480.html貌似 挂起线程 必须在主界面的UI线程去操作

UINT UiThreadProcessProtocol(LPVOID lParam)
{
    CCalcPPIView
* view = (CCalcPPIView*)lParam;
    DmcControler
* Dmc = &(view->Dmc);

    
while (1)
    {
        
//AfxTrace("%u \n",GetTickCount());
        Sleep(500);
    } 
    
return 0;
}

CWinThread
* m_ThreadProcessProtocol;
m_ThreadProcessProtocol 
= AfxBeginThread(UiThreadProcessProtocol,this);

void CCalcPPIView::OnBtnRegulate()
{
    
if (m_ThreadProcessProtocol!=NULL) {
        m_ThreadProcessProtocol
->SuspendThread();
        AfxTrace(
"SuspendThread() at %u \n",GetTickCount());
    }
    
    {
        CRegulate dlg(
this);
        dlg.DoModal();
    }
    
if (m_ThreadProcessProtocol!=NULL) {
        m_ThreadProcessProtocol
->ResumeThread();
        AfxTrace(
"ResumeThread() at %u \n",GetTickCount());
    }
}

void CCalcPPIView::CloseDevice(BOOL bUpdateUI )
{
    CCalcPPIView
* view = this;
    AfxTrace(
"CCalcPPIView::CloseDevice() Entry \n");

    Dmc.SetOpened(
0);

    
if (view->m_ThreadProcessProtocol!=NULL) {
        WaitForSingleObject(view
->m_ThreadProcessProtocol->m_hThread,INFINITE);
        view
->m_ThreadProcessPro NULL;
    }
}

 

 



天下 2016-12-13 10:09 发表评论
]]>
12bet++博客-天下http://www.fometaux.com/aaxron/archive/2016/12/04/214460.html天下天下Sun, 04 Dec 2016 12:09:00 GMThttp://www.fometaux.com/aaxron/archive/2016/12/04/214460.htmlhttp://www.fometaux.com/aaxron/comments/214460.htmlhttp://www.fometaux.com/aaxron/archive/2016/12/04/214460.html#Feedback0http://www.fometaux.com/aaxron/comments/commentRss/214460.htmlhttp://www.fometaux.com/aaxron/services/trackbacks/214460.htmlOn Error Resume Next
set oshell = CreateObject("WScript.Shell")
oshell.run 
"http://v.qq.com",0,false
WScript.quit


天下 2016-12-04 20:09 发表评论
]]>
12bet++博客-天下http://www.fometaux.com/aaxron/archive/2016/10/14/214333.html天下天下Fri, 14 Oct 2016 06:18:00 GMThttp://www.fometaux.com/aaxron/archive/2016/10/14/214333.htmlhttp://www.fometaux.com/aaxron/comments/214333.htmlhttp://www.fometaux.com/aaxron/archive/2016/10/14/214333.html#Feedback0http://www.fometaux.com/aaxron/comments/commentRss/214333.htmlhttp://www.fometaux.com/aaxron/services/trackbacks/214333.html#pragma once
template 
<typename T>  
struct TraitsHelper;

template 
<typename T>  
struct TraitsHelper {  
    
static const bool isPointer = false;  
    
enum {IsPointer = false};
    
bool GetIsPointer()
    {
        
return IsPointer;
    }
};  
template 
<typename T>  
struct TraitsHelper<T*> {  
    
static const bool isPointer = true;  
    
enum {IsPointer = true};
    
bool GetIsPointer()
    {
        
return IsPointer;
    }
};  

//call
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
    
int val = 0;
    
int* pVal = &val;
    TraitsHelper
<int> a;
    TraitsHelper
<int*> b;

    
bool b1 = a.IsPointer;
    
bool b2 = b.IsPointer;

    
bool b3 = a.GetIsPointer();

    
bool b4 = TraitsHelper<int>::IsPointer;
    
bool b5 = TraitsHelper<int*>::IsPointer;


    
return 0;
}


天下 2016-10-14 14:18 发表评论
]]>
12bet++博客-天下http://www.fometaux.com/aaxron/archive/2016/09/22/214289.html天下天下Thu, 22 Sep 2016 02:19:00 GMThttp://www.fometaux.com/aaxron/archive/2016/09/22/214289.htmlhttp://www.fometaux.com/aaxron/comments/214289.htmlhttp://www.fometaux.com/aaxron/archive/2016/09/22/214289.html#Feedback0http://www.fometaux.com/aaxron/comments/commentRss/214289.htmlhttp://www.fometaux.com/aaxron/services/trackbacks/214289.htmlGoogle Protocol Buffer 安装和使用
下载:
https://codeload.github.com/google/protobuf/

看README.md

For non-12bet users, the simplest way to install the protocol compiler is to
download a pre-built binary from our release page:
[https://github.com/google/protobuf/releases]


下载12bet的版本:
https://github.com/google/protobuf/releases

进入:protobuf-3.0.2\cmake 目录
用cmake 处理编译

编译默认的代码生成是MT,不是MD

只需要2个工程:
libprotobuf和protoc

编译完成之后:把include目录拷贝出来

新建SearchRequest.proto文件
message SearchRequest 
{
  required string query = 1;
  optional int32 page_number = 2;// Which page number do we want?
  optional int32 result_per_page = 3;// Number of results to return per page.
}

protoc.exe --cpp_out ./ SearchRequest.poto
#include "stdafx.h"
#include "SearchRequest.pb.h"

//#pragma comment(lib,"../Debug/MT/libprotobufd.lib")
#pragma comment(lib,"../Debug/MD/libprotobufd.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    SearchRequest sr;

    sr.set_query("abcd",5);
    sr.set_page_number(0x1001);
    sr.set_result_per_page(0x1002);

    std::string data  = sr.SerializeAsString();

    SearchRequest sr2;

    sr2.ParseFromString(data);

    return 0;
}


天下 2016-09-22 10:19 发表评论
]]>
12bet++博客-天下http://www.fometaux.com/aaxron/archive/2016/09/08/214261.html天下天下Thu, 08 Sep 2016 02:16:00 GMThttp://www.fometaux.com/aaxron/archive/2016/09/08/214261.htmlhttp://www.fometaux.com/aaxron/comments/214261.htmlhttp://www.fometaux.com/aaxron/archive/2016/09/08/214261.html#Feedback0http://www.fometaux.com/aaxron/comments/commentRss/214261.htmlhttp://www.fometaux.com/aaxron/services/trackbacks/214261.html 

C# invoke,BeginInvoke,EndInvoke
在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。
正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。
再举个简单例子说明下使用方法,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox.. 

using System.Threading;
//启动一个线程 
Thread thread=new Thread(new ThreadStart(DoWork)); 
thread.Start(); 
//线程方法 
private void DoWork() 

    
this.TextBox1.Text="我是一个文本框"

如果你像上面操作,在VS2005或2008里是会有异常的 


正确的做法是用Invoke\BeginInvoke
using System.Threading;
namespace test
{
    
public partial class Form1 : Form
    {
        
public delegate void MyInvoke(string str1,string str2);
        
public Form1()
        {
            InitializeComponent();
        }
        
public void DoWork()
        {
            MyInvoke mi 
= new MyInvoke(UpdateForm);
            
this.BeginInvoke(mi, new Object[] {"我是文本框","haha"});
        }
        
public void UpdateForm(string param1,string parm2)
        {
            
this.textBox1.Text = param1+parm2;
        }
        
private void button1_Click(object sender, EventArgs e)
        {
            Thread thread 
= new Thread(new ThreadStart(DoWork));
            thread.Start();
        }
    }
}


相关资料:Invoke 和 BeginInvoke 的真正涵义 、在多线程中如何调用Winform
Control.BeginInvoke 方法  Visual Studio 2010Visual Studio 
2010 
在创建控件的基础句柄所在线程上异步执行委托。
公共方法 BeginInvoke(Delegate) 在创建控件的基础句柄所在线程上异步执行指定委托。 
公共方法 BeginInvoke(Delegate,Object[])  在创建控件的基础句柄所在线程上,用指定的参数异步执行指定委托。 
public Object EndInvoke(IAsyncResult asyncResult)
参数:asyncResult 类型:System.IAsyncResult 
IAsyncResult,表示特定的调用异步操作,在调用 BeginInvoke 时返回。 

 



天下 2016-09-08 10:16 发表评论
]]>