小编She*_*eed的帖子

如何为Control.BeginInvoke委派AsyncCallback方法?(.净)

是否可以在"火与忘"方式之外使用Control.BeginInvoke?我想更改以下请求以委托回调方法,以便我可以在每个异步调用完成时执行某些操作.

this.BeginInvoke(new RefreshRulesDelegate(RefreshRules), new object[] { ctrl, ctrl.DsRules, ctrl.CptyId });  
Run Code Online (Sandbox Code Playgroud)

我可以用普通的delegate.BeginInvoke这样做

RefreshRulesDelegate del = new RefreshRulesDelegate(RefreshRules);
            del.BeginInvoke(ctrl, ctrl.DsRules, ctrl.CptyId, new AsyncCallback(RefreshCompleted), del);  
Run Code Online (Sandbox Code Playgroud)

但因为我正在调用Control .BeginInvoke,因为我得到"跨线程操作无效"错误,所以无法执行此操作.
有人帮吗?

对于收到的一些答案,我将澄清"为什么".我需要在我的GUI上加载/刷新一个Control,而不需要锁定应用程序的其余部分.该控件包含许多控件(ruleListCtls),这些控件都需要检索数据集并将其传递给它们.即

public void RefreshAll()
{
    foreach (LTRFundingRuleListControl ctrl in ruleListCtls)
    {
        this.BeginInvoke(new RefreshRulesDelegate(RefreshRules), new object[]{ctrl,ctrl.DsRules, ctrl.CptyId });   
    }
}  
Run Code Online (Sandbox Code Playgroud)

我发现如果我提供一个委托回调方法并将修改控件的任何代码移回到创建它们的主GUI线程上(以避免跨线程错误),我可以这样做

public void RefreshAll()
{
    IntPtr handle; 
    foreach (LTRFundingRuleListControl ctrl in ruleListCtls)
    {
        handle = ctrl.Handle;
        RefreshRulesDsDelegate del = new RefreshRulesDsDelegate(RefreshRulesDs);
        del.BeginInvoke(ctrl.DsRules, ctrl.CptyId, handle, out handle, new AsyncCallback(RefreshCompleted), del);
    }        
}

private void RefreshCompleted(IAsyncResult result) …
Run Code Online (Sandbox Code Playgroud)

.net c# begininvoke asynccallback

5
推荐指数
1
解决办法
6056
查看次数

标签 统计

.net ×1

asynccallback ×1

begininvoke ×1

c# ×1