gpt4 book ai didi

c# - 使用 BeginInvoke 时有没有办法确定执行处理程序的线程?

转载 作者:行者123 更新时间:2023-12-02 14:45:56 24 4
gpt4 key购买 nike

我想确定使用 BeginInvoke 时执行处理程序的线程。现在,每次我调用该方法时,处理程序都会由不同的线程执行。有没有办法确定线程?

using System;
using System.Threading;
using System.Runtime.Remoting.Messaging;

namespace Delegate
{
public delegate void BarDelegate(string argument);

public class Foo
{
private void handleBar(string argument)
{
int threadId = AppDomain.GetCurrentThreadId();
Console.WriteLine("Argument is " + argument + " " + threadId.ToString());
}

public void bar(string argument)
{
BarDelegate smd = new BarDelegate(this.handleBar);
smd.BeginInvoke(argument, null, null);
}

public static void Main()
{
Console.WriteLine(AppDomain.GetCurrentThreadId().ToString());
Foo ds = new Foo();
ds.bar("Hello, world!");
Console.ReadLine();
ds.bar("Hello, world!");
Console.ReadLine();
}
}
}

最佳答案

获取在特定线程上执行的异步代码需要同步提供程序。 .NET框架中有两个主要的,WindowsFormsSynchronizationContext帮助Control.BeginInvoke()在UI线程上运行代码。以及 DispatcherSynchronizationContext,支持 WPF 的 Dispatcher.BeginInvoke()。当您为这些类库调用 Application.Run() 时,会自动安装这些提供程序。它们只能调用 UI 线程。

控制台模式程序没有同步提供程序。并且委托(delegate)的 BeginInvoke() 方法始终在线程池线程上执行。如果您无法使用这些类库,并且您使用的组件不支持多线程(很少有组件支持多线程,除非它是 COM 服务器),那么使用线程对您来说不是一个可用的选项。

关于c# - 使用 BeginInvoke 时有没有办法确定执行处理程序的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4957856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com