c# - 从特定线程调用方法

标签 c# multithreading task-parallel-library

如何在调用 SomeAsyncMethod 的同一线程上调用 onCompleteCallBack 方法?

public void SomeAsycMethod ( Action<object> onCompleteCallBack )
{
    // get the current thread 
    /* var ThisThread = Thread.CurrentThread. */

    Task.Factory.StartNew( () =>
    {
        Thread.Sleep( 1000 );// do some work;

        // lastly call the onCompleteCallBack on 'ThisThread'
        onCompleteCallBack( "some result" );

        // I am looking for something like:
        /* ThisThread.Invoke("some result"); */
    });
}

最佳答案

虽然您不能保证您的回调会在同一个线程 上被调用,但您可以保证它会在同一个 中被调用Synchronization Context (假设原始调用中存在一个)。

public void SomeAsycMethod ( Action<object> onCompleteCallBack )
{
    // get the current context
    var context = SynchronizationContext.Current;

    Task.Factory.StartNew( () =>
    {
        Thread.Sleep( 1000 );// do some work;

        // lastly call the onCompleteCallBack on 'ThisThread'
        onCompleteCallBack( "some result" );

        // I am looking for something like:
        context.Post(s => onCompleteCallBack ("some result"), null); 
    });
}

例如,在 Windows 窗体或 WPF 程序中,以上将确保在 GUI 线程上调用回调(相应地通过消息循环或调度程序)。对于 ASP.NET 上下文也是如此。

话虽如此,我同意 Justin Harvey 返回 Task<T> 的观点。可能会是更好的设计。

关于c# - 从特定线程调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13609615/

相关文章:

C# 多线程,三个线程并行工作并相互发送数据并按顺序工作

multithreading - Spring 集成文件轮询。如果移动文件是否需要使用 AcceptOnceFileListFilter ?

wpf - 在WPF中 sleep 循环

java - java程序的线程内语义

c# - 关于任务延续的问题

c# - MaxDegreeOfParallelism 不适用于任务列表?

c# - 具有批量生产者的生产者/消费者模式

c# - 向 Silverlight 客户端公开数据库索引是否安全?

c# - 在 Entity Framework 中使用 context.SaveChanges()

c# - 在 If 语句中评估 Bool 错误