c# - P/Invoke 调用的方法是否在同一个线程中运行?

标签 c# .net multithreading mono pinvoke

我有一个用 C 编写的 native 库。例如,这是一个简单的函数:

int my_test_method(int value) {
  return value * 2;
}

我还在 C# P/Invoke 类中声明了这个方法:

[DllImport("helloworld.so", CallingConvention = CallingConvention.Cdecl)]
public static extern int my_test_method(int value);

如果我在辅助线程中调用这个函数,本地代码会在同一个线程中执行吗?即,如果 native 函数是线程安全的,此方法是否会并行运行而不会阻塞其他线程?

Task.Factory.StartNew(() => {
  int value = my_test_method(2);
});    

额外奖励:在 Windows、Linux、OSX、iOS 和 Android 下,对于 .NET 和 Mono 是否如此?

最佳答案

native 函数将在调用托管 P/Invoke 方法的同一线程上执行。

如果您在后台线程上调用托管 P/Invoke 方法,则 native 函数将在该线程上执行。

对于所有版本的 .NET 和 Mono,Windows、Linux、iOS、OSX、Android、Windows Phone 以及我可能忘记的其他一些版本都是如此。

关于c# - P/Invoke 调用的方法是否在同一个线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29217567/

相关文章:

c# - Linq 到 XML : Queries for If blocks C#

c# - 161803398 是一个 'Special' 的数字吗? Math.Random() 内部

c# - 验证元素的未转义长度

c# - 捕获在不同线程中抛出的异常

c# - 检查这个星期一是否是一个月中的最后一个星期一

c# - MVC JsonResult 方法不接受参数

.net - Python 中的泛型类型转换

.net - 什么图用于表示多个系统之间的协议(protocol)?

c++ - linux 中的上下文获取 SIGSEGV

c - OpenMP for 循环没有给出正确的结果