Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跨线程操作在多事件处理期间无效_C#_Multithreading_Winforms_User Interface - Fatal编程技术网

C# 跨线程操作在多事件处理期间无效

C# 跨线程操作在多事件处理期间无效,c#,multithreading,winforms,user-interface,C#,Multithreading,Winforms,User Interface,我在Windows窗体应用程序中遇到UI问题。我知道网上有无数关于这个问题的帖子,但我仍然找不到合适的解决办法 我有这个方法: private void AddContactTile(ContactTile c) { if (mainPanel.InvokeRequired) { AddContactTileDelegate ctdelegate = new AddContactTileDelegate(AddContactTile); mainP

我在Windows窗体应用程序中遇到UI问题。我知道网上有无数关于这个问题的帖子,但我仍然找不到合适的解决办法

我有这个方法:

private void AddContactTile(ContactTile c)
{
    if (mainPanel.InvokeRequired)
    {
        AddContactTileDelegate ctdelegate = new AddContactTileDelegate(AddContactTile);
        mainPanel.BeginInvoke(ctdelegate, c);
    }
    else
    {
        mainPanel.Controls.Add(c);
    }
}
private void ChangeTileStatus(string userid)
{
    ContactTile tile = contactTiles.Find(x => x.Key == userid).Value;
    if (tile.statusLabel.InvokeRequired)
    {
        ChangeTileStatusDelegate ctsdelegate = new ChangeTileStatusDelegate(ChangeTileStatus);
        tile.statusLabel.BeginInvoke(ctsdelegate, userid);
    }
    else
    {
        if (contacts.ContainsKey(userid))
        {
            tile.statusLabel.Visible = contacts[userid].IsAvailable;
            tile.Refresh();
        }
    }
}
这种方法:

private void AddContactTile(ContactTile c)
{
    if (mainPanel.InvokeRequired)
    {
        AddContactTileDelegate ctdelegate = new AddContactTileDelegate(AddContactTile);
        mainPanel.BeginInvoke(ctdelegate, c);
    }
    else
    {
        mainPanel.Controls.Add(c);
    }
}
private void ChangeTileStatus(string userid)
{
    ContactTile tile = contactTiles.Find(x => x.Key == userid).Value;
    if (tile.statusLabel.InvokeRequired)
    {
        ChangeTileStatusDelegate ctsdelegate = new ChangeTileStatusDelegate(ChangeTileStatus);
        tile.statusLabel.BeginInvoke(ctsdelegate, userid);
    }
    else
    {
        if (contacts.ContainsKey(userid))
        {
            tile.statusLabel.Visible = contacts[userid].IsAvailable;
            tile.Refresh();
        }
    }
}

它们都在事件处理程序中调用。现在,由于事件可能同时引发,我在
AddContactTile
方法中的
statusLabel
控件上收到一条无效的跨线程操作消息

有人知道正确同步这些访问的方法吗?谢谢

AddContact方法的代码:

public void AddContact(FacebookUser user)
{
    contacts[user.id].DisplayPictureAvailable += new EventHandler<UserEventArgs>(Contacts_DisplayPictureAvailable);
    contacts[user.id].StatusChanged += new EventHandler<UserEventArgs>(Contacts_StatusChanged);
    ContactTile c = new ContactTile(user.name, user.id) { Location = new Point(0, contactTiles.Count == 0 ? 0 : contactTiles.Last().Value.Bounds.Bottom) };
    contactTiles.Add(new KeyValuePair<string, ContactTile>(user.id, c));
    AddContactTile(c);
}

您可以使用互斥体并调用
Mutex.WaitOne().BeginInvoke(…)之前的代码>操作
或检查委托本身的互斥体


您可以使用互斥体并调用
Mutex.WaitOne().BeginInvoke(…)之前的代码>操作
或检查委托本身的互斥体


ContactTile
是在UI线程以外的线程中创建的,但在
AddContactTile
中,您将其添加到
mainPanel的
线程中,我认为这是UI线程。遵循此规则,尝试在UI线程中创建
ContactTile
实例。

ContactTile
是在UI线程以外的线程中创建的,但在
AddContactTile
中,您将其添加到
mainPanel的
线程中,我假设该线程是UI线程。遵循此规则,尝试在UI线程中创建
ContactTile
实例。

在添加
AddContactTile
之前,在哪个线程中创建了
ContactTile
?我将在
AddContact
方法中创建它,并将其作为编辑发布。
AddContact
方法是在处理程序中实际调用的方法。在begininvoke中,您需要在AddContactTile方法中的statusLabel控件上传递一个对象数组“无效的跨线程操作消息”-但是AddContactTile没有引用statusLabel?因此,在UI线程以外的线程中创建了一个
ContactTile
,但是在
AddContactTile
中,您将其添加到
mainPanel的
线程中,我认为该线程就是UI线程。尝试在UI线程中创建
ContactTile
实例。在添加
AddContactTile
之前,在哪个线程中创建了
ContactTile
?我将在
AddContact
方法中创建它,并将其作为编辑发布。
AddContact
方法是在处理程序中实际调用的方法。在begininvoke中,您需要在AddContactTile方法中的statusLabel控件上传递一个对象数组“无效的跨线程操作消息”-但是AddContactTile没有引用statusLabel?因此,在UI线程以外的线程中创建了一个
ContactTile
,但是在
AddContactTile
中,您将其添加到
mainPanel的
线程中,我认为该线程就是UI线程。尝试在UI线程中创建
ContactTile
实例。这解决了我的问题,我只是使用new
thread(new ThreadStart(delegate(){})).Start()在一个单独的线程上创建并添加了联系人tile并且问题已修复。:)这就解决了我的问题,我只是使用new
thread(newthreadstart(delegate(){})).Start()在一个单独的线程上创建并添加了联系人互动程序并且问题已修复。:)