C#多線程異步執(zhí)行和跨線程訪問控件Helper_第1頁
C#多線程異步執(zhí)行和跨線程訪問控件Helper_第2頁
C#多線程異步執(zhí)行和跨線程訪問控件Helper_第3頁
C#多線程異步執(zhí)行和跨線程訪問控件Helper_第4頁
C#多線程異步執(zhí)行和跨線程訪問控件Helper_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第C#多線程異步執(zhí)行和跨線程訪問控件Helper////summary

///paramname="func"方法,如果方法中調(diào)用了控件,請使用ThreadInvokerControl(()={您的操作})進行包括/param

///paramname="callback"執(zhí)行完成回調(diào),參數(shù)為object,如果錯誤返回的是Exception,否則為null,如果為空則默認調(diào)用基類回調(diào)方法/param

///paramname="enableControl"調(diào)用線程時禁用的控件/param

publicstaticvoidTaskRun(

Formfrm,

FuncTaskfunc,

Actionobjectcallback=null,

Control[]enableControl=null)

if(enableControl!=null)

SetControlEnableds(enableControl,false);

Task.Factory.StartNew(()=

Tasktask=func();

if(task.Exception!=nulltask.Exception.InnerException!=null)

throwtask.Exception.InnerException;

callback.Invoke(null);

catch(Exceptionex)

if(callback!=null)

callback(ex);

else

ThreadBaseCallBack(frm,ex);

finally

if(enableControl!=nullfrm!=null)

ThreadInvokerControl(frm,()={SetControlEnableds(enableControl,true);});

///summary

///功能描述:線程默認回調(diào)方法

////summary

publicstaticvoidThreadBaseCallBack(Formfrm,Exceptionex)

if(frm!=null)

ThreadInvokerControl(frm,()=

ExceptionlastEx=ex.GetOriginalException();

MessageBox.Show(lastEx.Message);

catch

///summary

///功能描述:委托調(diào)用,用于夸線程訪問控件

////summary

///paramname="action"action/param

///paramname="f"所在窗體,默認使用當前窗體/param

publicstaticvoidThreadInvokerControl(Formfrm,Actionaction)

if(frm!=null)

if(frm.InvokeRequired)

frm.BeginInvoke(action);

else

action();

#endregion

#region提示層

[DllImport("user32.dll")]

privatestaticexternboolSetForegroundWindow(IntPtrhWnd);

privatestaticvoidShowProcessPanel(Controlparent,stringstrMessage)

if(parent.InvokeRequired)

parent.BeginInvoke(newMethodInvoker(delegate

ShowProcessPanel(parent,strMessage);

}));

else

parent.VisibleChanged-=newEventHandler(parent_VisibleChanged);

parent.VisibleChanged+=newEventHandler(parent_VisibleChanged);

parent.FindForm().FormClosing-=ControlHelper_FormClosing;

parent.FindForm().FormClosing+=ControlHelper_FormClosing;

Controlcontrol=null;

lock(parent)

control=HaveProcessPanelControl(parent);

if(control==null)

control=CreateProgressPanel();

parent.Controls.Add(control);

FWaitingfWaiting=control.TagasFWaiting;

fWaiting.Message=strMessage;

fWaiting.Show();

privatestaticvoidControlHelper_FormClosing(objectsender,FormClosingEventArgse)

Controlcontrol=senderasControl;

control.FindForm().FormClosing-=ControlHelper_FormClosing;

CloseWaiting(control);

privatestaticvoidparent_VisibleChanged(objectsender,EventArgse)

Controlcontrol=senderasControl;

control.VisibleChanged-=newEventHandler(parent_VisibleChanged);

if(!control.Visible)

CloseWaiting(control);

privatestaticvoidCloseWaiting(Controlcontrol)

Control[]array=control.Controls.Find("myProgressPanelext",false);

if(array.Length0)

ControlmyProgress=array[0];

if(myProgress.Tag!=nullmyProgress.TagisFWaiting)

FWaitingfWaiting=myProgressasFWaiting;

if(fWaiting!=null!fWaiting.IsDisposedfWaiting.Visible)

fWaiting.Hide();

privatestaticvoidCloseProcessPanel(Controlparent)

if(parent.InvokeRequired)

parent.BeginInvoke(newMethodInvoker(delegate

CloseProcessPanel(parent);

}));

elseif(parent!=null)

Controlcontrol=HaveProcessPanelControl(parent);

if(control!=null)

Formfrm=control.TagasForm;

if(frm!=null!frm.IsDisposedfrm.Visible)

if(frm.InvokeRequired)

frm.BeginInvoke(newMethodInvoker(delegate

frm.Hide();

}));

else

frm.Hide();

privatestaticControlHaveProcessPanelControl(Controlparent)

Control[]array=parent.Controls.Find("myProgressPanelext",false);

Controlresult;

if(array.Length0)

result=array[0];

else

result=null;

returnresult;

privatestaticControlCreateProgressPanel()

returnnewLabel

Name="myProgressPanelext",

Visible=false,

Tag=newFWaiting

TopMost=true,

#endregion

#region禁用控件時不改變空間顏色

[System.Runtime.InteropServices.DllImport("user32.dll")]

privatestaticexternintSetWindowLong(IntPtrhWnd,intnIndex,intwndproc);

[System.Runtime.InteropServices.DllImport("user32.dll")]

privatestaticexternintGetWindowLong(IntPtrhWnd,intnIndex);

privateconstintGWL_STYLE=-16;

privateconstintWS_DISABLED=0x8000000;

///summary

///功能描述:設置控件的Enable屬性,控件不改顏色

////summary

///paramname="c"c/param

///paramname="enabled"enabled/param

privatestaticvoidSetControlEnabled(Controlc,boolenabled)

if(enabled)

SetWindowLong(c.Handle,GWL_STYLE,(~WS_DISABLED)GetWindowLong(c.Handle,GWL_STYLE));

else

SetWindowLong(c.Handle,GWL_STYLE,WS_DISABLED+GetWindowLong(c.Handle,GWL_STYLE));

///summary

///功能描述:設置多個控件的Enable屬性,控件不改顏色

////summary

///paramname="cs"cs/param

///paramname="enabled"enabled/param

privatestaticvoidSetControlEnableds(Control[]cs,boolenabled)

foreach(varcincs)

SetControlEnabled(c,enabled);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論