Toon posts:

[C#] remoting, events en controls

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het volgende probleem.

Ik heb een remoting object die dmv events berichten doorgeeft aan geregistreerde client forms.
Alleen in die afhandeling van de client wil ik graag naar een listview schrijven maar ik krijg een exceptie omdat de delegate niet naar mijn control mag schrijven.

remoting object:
C#:
1
2
3
4
5
6
7
8
9
10
public delegate void ProcessMessageEventHandler(ProcessManagerMessageEventArg arg);
public event ProcessMessageEventHandler ClientMessage;

....

if (ClientMessage != null)
{
    ProcessManagerMessageEventArg arg = _messageQueue.Dequeue();
    ClientMessage(arg);
}


Client form:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
_processManager.ClientMessage += new ProcessManager.ProcessMessageEventHandler(_processManager__processMessage);

....

public void _processManager__processMessage(ProcessManagerMessageEventArg arg)
{
    AddMessageToProcessLog(arg.message, LogMessageType.Information);
}

....

private void AddMessageToProcessLog(string message, LogMessageType type)
{
    try
    {
        ListViewItem lvi = new ListViewItem();
        lvi.ImageIndex = (int)type;
        lvi.SubItems.Add(DateTime.Now.ToLongDateString());
        lvi.SubItems.Add( message );
        lvBatchProcessLog.Items.Add(lvi);
    }
    catch (Exception ex)
    {
        Log.Error(ex);
        MessageBox.Show(ex.Message);
    }
}


Kan iemand me vertellen of ik op een andere manier deze messanging kan regelen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:04
Een tijd geleden wou ik hetzelfde doen, en ben ik op hetzelfde probleem gebotst:
[rml][ .NET] Remoting en events[/rml]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik heb het even doorgelezen, maar ik denk dat daar meer het probleem van serializeren aan de orde was. Dus dat je met de default typeFilterLevel geen delegates kan gebruiken.

Ik heb het probleem dat het remoting object niet de rechten heeft om naar mijn client controls te schrijven.

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:04
Welke exceptie krijg je dan precies ?

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Is het niet gewoon het probleem dat je niet vanuit je GUI thread je Listview aanroept?

Dan zou je gewoon een Invoke moeten doen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Dat laatste is inderdaad het geval, maar dit is mijn eerste remoting project.
Ik zal eens kijken naar invoke.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op vrijdag 30 juni 2006 @ 13:55:
Dat laatste is inderdaad het geval, maar dit is mijn eerste remoting project.
Ik zal eens kijken naar invoke.
Het heeft eigenlijk niet zo veel met Remoting te maken. Het gaat erom dat je je GUI alleen mag benaderen vanuit je GUI thread. Aangezien je met Remoting automatisch met meer threads te maken krijgt zul je daar dus wat mee moeten doen. Forms components hebben een method Invoke ( en BeginInvoke voor asynchroon ). Je methodes kan je dan ongeveer zo maken

C#:
1
2
3
4
5
6
7
8
9
public void DoSomethingInGui()
{
    if(InvokeRequired)
    {
        Invoke( new MethodInvoker( DoSomethingInGui ) );
        return;
    }
    //Do something here
}

Op deze manier wordt code altijd in je Gui thread uitgevoerd als het nodig is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:04
Zowiezo zal je moeten werken met een soort 'tussen-class' zoals ik gedaan heb en je kan zien in dat andere topic.
In die class zal je dan idd moeten testen of je moet 'invoken' of niet.
Zo bv:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void OnFinishedEventHandler(object sender, MigrationBatchFinishedEventArgs e)
        {
        
            System.Windows.Forms.Control            ctrl;
        
            if( _finishedEventHandler != null )
            {
                ctrl = _finishedEventHandler.Target as System.Windows.Forms.Control;
                
                if( ctrl != null && ctrl.InvokeRequired )
                {
                    ctrl.Invoke (_finishedEventHandler, new object[] {sender, e});
                }
                else
                {
                    _finishedEventHandler(sender, e);
                }
            }
        }


Waarbij _finishedEventHandler een event is.

https://fgheysels.github.io/

Pagina: 1