[AppKit] Allow static properties to execute on non-UI threads. (#8330)

VSMac has failing tests when they query the NSScrees.Screens property
which the following swift code shows that it can be executed in a diff
thread:

```swift
import Cocoa
import AppKit

DispatchQueue.global(qos: .background).async {
    print("This is run on the background queue")

    print(Thread.current)
    var screens = NSScreen.screens
    print (screens.count)
}
```

Fixes: https://github.com/xamarin/xamarin-macios/issues/8329
This commit is contained in:
Manuel de la Pena 2020-04-09 10:24:16 -04:00 коммит произвёл GitHub
Родитель a5ac0ea102
Коммит 4621b467df
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 74 добавлений и 0 удалений

Просмотреть файл

@ -13152,14 +13152,18 @@ namespace AppKit {
[BaseType (typeof (NSObject))] [BaseType (typeof (NSObject))]
partial interface NSScreen { partial interface NSScreen {
[ThreadSafe]
[Static] [Static]
[Export ("screens", ArgumentSemantic.Copy)] [Export ("screens", ArgumentSemantic.Copy)]
NSScreen [] Screens { get; } NSScreen [] Screens { get; }
[ThreadSafe]
[Static] [Static]
[Export ("mainScreen")] [Export ("mainScreen")]
NSScreen MainScreen { get; } NSScreen MainScreen { get; }
[ThreadSafe]
[Static] [Static]
[Export ("deepestScreen")] [Export ("deepestScreen")]
NSScreen DeepestScreen { get; } NSScreen DeepestScreen { get; }

Просмотреть файл

@ -156,6 +156,7 @@
<Compile Include="..\common\TestRuntime.cs"> <Compile Include="..\common\TestRuntime.cs">
<Link>shared\TestRuntime.cs</Link> <Link>shared\TestRuntime.cs</Link>
</Compile> </Compile>
<Compile Include="src\AppKit\NSScreen.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\external\guiunit\src\framework\GuiUnit_NET_4_5.csproj"> <ProjectReference Include="..\..\external\guiunit\src\framework\GuiUnit_NET_4_5.csproj">

Просмотреть файл

@ -0,0 +1,69 @@
using NUnit.Framework;
using System;
using System.Threading;
#if !XAMCORE_2_0
using MonoMac.AppKit;
using MonoMac.ObjCRuntime;
using MonoMac.Foundation;
#else
using AppKit;
using ObjCRuntime;
using Foundation;
#endif
namespace Xamarin.Mac.Tests
{
[TestFixture]
public class NSSCreenTests
{
[Test]
public void ScreensNotMainThread ()
{
var called = new AutoResetEvent (false);
var screensCount = 0;
var backgroundThread = new Thread (() => {
screensCount = NSScreen.Screens.Length;
called.Set ();
});
backgroundThread.Start ();
Assert.IsTrue (called.WaitOne (1000), "called");
Assert.IsTrue (screensCount > 0, "screens count");
}
[Test]
public void MainScreenNotMainThread ()
{
var called = new AutoResetEvent (false);
NSScreen main = null;
var backgroundThread = new Thread (() => {
main = NSScreen.MainScreen;
called.Set ();
});
backgroundThread.Start ();
Assert.IsTrue (called.WaitOne (1000), "called");
Assert.IsNotNull (main, "main screen");
}
[Test]
public void DeepScreenNotMainThread ()
{
var called = new AutoResetEvent (false);
NSScreen deepScreen = null;
var screenCount = 0;
var backgroundThread = new Thread (() => {
screenCount = NSScreen.Screens.Length;
deepScreen = NSScreen.DeepestScreen;
called.Set ();
});
backgroundThread.Start ();
Assert.IsTrue (called.WaitOne (1000), "called");
if (screenCount > 1) {
Assert.IsNotNull (deepScreen, "deep screen");
} else {
Assert.Inconclusive ("Only one screen detected.");
}
}
}
}