English 中文(简体)
代表
原标题:Invoke a delegate on a specific thread C#

是否有办法让某个代表走到特定的路边?

我有:

CustomDelegate del = someObject.someFunction;
Thread dedicatedThread = ThreadList[x];

Can 我有一个始终如一的背景,在我需要的时候,我就能够站起来,并援引我自己的代表。 每一次都必须有同样的距离。

[Edit]

为什么我想要一线 dedicated光,是因为我不得不管理该代表,在<代码>ymilliseconds”之后暂停该代表的读物,并在我接手另一位代表时恢复read。 我认为这是可能的。 我将有一个代表点,让阅读和操作的read的主要功能。

为了用一个具体例子澄清,我有一个游戏系统,有一把角色read子。 我希望每个参与者都为这方面的游戏活动管理活动。 如果事件处理者需要太多时间,我就希望能够暂停该特定角色的活动,直到下一次活动结束。

因此,我有一只能够操作多个活动处理器的专用镜子,我可以把某个特定角色搁置一边,如果它被gged住或占用太长时间。

最佳回答

我认为,最好的解决办法是使用<代码>Task 的物体,将其排在http://blogs.msdn.com/b/pfxteam/archive/04/07/9990421.aspx” rel=“nofollow noreferer”>。 穿透。

或者,您可在Nito.Async上使用<条码>,以形成一种与<条码>行动代表的固定界面。

然而,这两种行动都不会直接满足另一个需要:“暂停”行动的能力,并且继续采取另一种行动。 为此,你需要在所有行动中不断缩小“同步点”,并能够拯救国家、重新排列国家,并继续开展下一步行动。

所有这些复杂性几乎都接近于一种可怕的时间安排制度,因此我建议退步,并做更多的重新设计。 您可允许将每项行动提交<代码>。 校对 (我只建议每个条目编号为Task。) 你们仍需要缩小“同步点”,但是,不要挽救国家,重新排列,你只是需要暂停(锁定)。

问题回答

通常,我只是建议使用透镜或<代码>。 背景工作人类别——但这些类别并不能保证工作将在任何特定方面进行。 不清楚的是,你为什么会照顾到哪些东西可以操作,但认为这确实很重要......。

请通过<代码>Delegate,通过某种共享记忆,如点。 现在的背景是,必须看看看这个问题,在存在时就把代表撤出,执行。

如果看看看看看看看看看看看管你的代码,那么你可以总是使用<代码>BeginInvoke的方法:

// wrap your custom delegate in an action for simplicity ...
Action someCode = () => yourCustomDelegate( p1, p2, p3, ... );
// asynchronously execute the currying Action delegate on the threadpool...
someCode.BeginInvoke( someCode.EndInvoke, action );

你创造的镜子,你只能在你创建时指定ThreadStart代表。 没有任何规定允许将不同的代表安置到一个已经建立的深层。 透镜库不同,因为它使你能够代表你向以前创建的炉read提交代表。

不清楚你试图解决什么问题。 你们试图在一线上接手多位代表,以达到(或避免)目的是什么?

模式与同步点。 其中一个特点是,工人的校对可在要求工作受阻之前或之后开始。 这是因为一个名为Watin的COM物体包裹操纵因特网探索者的事件,而因特网探索者像一个骑着的婴儿一样,非常敏感。 可能改进的是删除<代码>Thread.Sleep(),可能还有AutoResetEvent,这将大大改善某些情况下的业绩。

这种模式的想法来自Justin Breitfeller s、Stephen Cleary s和LBushkin的答复。

    private Instantiate()
    {
        BrowserQueue = new ConcurrentQueue<BrowserAction>();
        BrowserThread = new Thread(new ThreadStart(BrowserThreadLoop));
        BrowserThread.SetApartmentState(ApartmentState.STA);
        BrowserThread.Name = "BrowserThread";
        BrowserThread.Start();
    }
    private static void BrowserThreadLoop()
    {
        while (true)
        {
            Thread.Sleep(500);
            BrowserAction act = null;
            while (Instance.BrowserQueue.TryDequeue(out act))
            {
                try
                {
                    act.Action();
                }
                catch (Exception ex) { }
                finally
                {
                    act.CompletionToken.Set();
                }
            }
        }
    }
    public static void RunBrowserAction(Action act)
    {
        BrowserAction ba = new BrowserAction() { Action = act, CompletionToken = new ManualResetEvent(false) };
        Instance.BrowserQueue.Enqueue(ba);
        ba.CompletionToken.WaitOne();
    }
    public class BrowserAction
    {
        public Action Action { get; set; } = null;
        public ManualResetEvent CompletionToken { get; set; } = null;
    }
    ConcurrentQueue<BrowserAction> BrowserQueue;




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签